ReadFile FILE_FLAG_NO_BUFFERING如何读取两个扇区之间的数据

ReadFile FILE_FLAG_NO_BUFFERING how to read data between two sectors

本文关键字:两个 之间 数据 扇区 NO FLAG FILE BUFFERING ReadFile 何读取 读取      更新时间:2023-10-16

我使用Windows ReadFile函数顺序读取4GB文件,使用FILE_FLAG_NO_BUFFERING。我使用64K的缓冲区,所有工作正常,但问题是我的数据在当前缓冲区的末尾和下一次读取之间被切断。例如,我有一个4字节的浮点数序列,当我到达最后一个浮点数时,当前缓冲区中只有三个字节,下一个字节将在下一个读缓冲区中出现。那么我该如何处理呢?我是否应该跟踪保存最后三个字节所消耗的字节数,然后在读取下一个缓冲区后附加最后一个字节?或者将缓冲区复制到另一个缓冲区,并在那里跟踪浮点数?但这并不能抵消不读取Windows缓存的优势?谢谢你的帮助。

我认为在边界上的特殊情况下,您应该将前一个块中的位和下一个块中的位并排复制到一个小的刮擦空间中,并从那里读取它们。当您不在边界上时,您不需要使用此划痕空间。

无论如何,您必须自己做这个计算,因为需要对未缓冲的读进行对齐。

但一个更好的问题是,你为什么认为你需要这样做?您是否尝试过使用std::ifstream读取您的文件?现代处理器和缓存在隐藏(或者实际上消除)您可能认为缓冲I/O执行的额外复制方面做了很大的努力。

同样,如果您是顺序读取,FILE_FLAG_NO_BUFFERING将抑制操作系统的预读机制。这几乎肯定会比绕过操作系统缓冲区所获得的收益要高得多。

我想你会发现最简单的代码在顺序读取大文件时表现最好。这就是现代系统在各个层面上进行优化的基本情况。