ReadFile FILE_FLAG_NO_BUFFERING如何读取两个扇区之间的数据
ReadFile FILE_FLAG_NO_BUFFERING how to read data between two sectors
我使用Windows ReadFile函数顺序读取4GB文件,使用FILE_FLAG_NO_BUFFERING。我使用64K的缓冲区,所有工作正常,但问题是我的数据在当前缓冲区的末尾和下一次读取之间被切断。例如,我有一个4字节的浮点数序列,当我到达最后一个浮点数时,当前缓冲区中只有三个字节,下一个字节将在下一个读缓冲区中出现。那么我该如何处理呢?我是否应该跟踪保存最后三个字节所消耗的字节数,然后在读取下一个缓冲区后附加最后一个字节?或者将缓冲区复制到另一个缓冲区,并在那里跟踪浮点数?但这并不能抵消不读取Windows缓存的优势?谢谢你的帮助。
我认为在边界上的特殊情况下,您应该将前一个块中的位和下一个块中的位并排复制到一个小的刮擦空间中,并从那里读取它们。当您不在边界上时,您不需要使用此划痕空间。
无论如何,您必须自己做这个计算,因为需要对未缓冲的读进行对齐。
但一个更好的问题是,你为什么认为你需要这样做?您是否尝试过使用std::ifstream
读取您的文件?现代处理器和缓存在隐藏(或者实际上消除)您可能认为缓冲I/O执行的额外复制方面做了很大的努力。同样,如果您是顺序读取,FILE_FLAG_NO_BUFFERING
将抑制操作系统的预读机制。这几乎肯定会比绕过操作系统缓冲区所获得的收益要高得多。
我想你会发现最简单的代码在顺序读取大文件时表现最好。这就是现代系统在各个层面上进行优化的基本情况。
相关文章:
- 给定两个偶数,求出它们之间所有偶数的平方和
- C++需要帮助从用户那里获得一个整数,并确保它在另外两个整数之间
- 如何在两个 boost::multi_arrays (C++) 之间执行数学运算?
- 查找字符在两个索引之间出现的次数
- 如何使用 OpenCV 解码在两个 UWP 应用之间发送的图像字节?
- C++两个源文件之间共享的枚举的静态实例
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- 以天C++为单位的两个时间戳之间的差异
- 将向量之间的数字放在另一个向量之间<vector>>如果两个数字的差值为 1
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- 在C++中查找两个向量之间最相似的值
- 两个有符号数字之间的距离
- Directx 12 :在两个进程之间共享图形内存
- 如何找到两个日期之间的时间差异(以秒和纳秒为单位)?
- 是否有一种标准方法来计算两个 asctime() 值之间的天数
- 如何找到两个棋盘平面之间的角度?
- 计算两个迭代器之间的距离时"Vector Iterators Incompatible"
- 将两个数字替换为给定数组中介于两个之间的单个数字
- 如何在两个其他两个之间设置工具栏