2011-08-21 60 views
1

我正在使用Windows ReadFile函数按顺序读取4GB文件,并使用FILE_FLAG_NO_BUFFERING。我使用的是64K的缓冲区,并且所有的工作都正确,但问题是我的数据在当前缓冲区结束和下一次读取之间被切断。例如,我有一个4字节的浮点数序列,当我到达最后一个浮点数时,只有三个字节在当前缓冲区中,下一个字节将进入下一个读缓冲区。那我该如何处理呢?我应该跟踪用于保留最后三个字节的字节数,然后在读取下一个缓冲区后追加最后一个字节数?或者,也许将缓冲区复制到另一个缓冲区并在那里跟踪浮游物?但是这并不能击败Windows缓存不读取的优势?谢谢你的帮助。ReadFile FILE_FLAG_NO_BUFFERING如何读取两个扇区之间的数据

回答

0

我认为,在你处于边界的特殊情况下,你应该将前一个块的位和下一个块的位并行复制到一个小的临时空间中,然后从那里读取它们完好无损。当你不在边界时,你不需要使用这个临时空间。

0

无论如何,你必须自己做这个会计,因为无缓冲的读取需要对齐。

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

此外,如果您正在顺序读取,FILE_FLAG_NO_BUFFERING将禁止操作系统的预读机器。这几乎肯定会让您远远超过绕过操作系统缓冲区所带来的成本。

我怀疑你会发现,最简单的代码将执行最好的连续阅读大文件。这几乎是现代系统针对每个级别进行优化的原因...

+0

感谢您的回答。我一直在阅读关于FILE_FLAG_NO_BUFFERING的文章,并且推荐阅读大文件时,比如说1GB以上。在这种情况下,缓存管理器无法很好地处理缓存。事实上,我尝试了ifstream和ReadFile与FILE_FLAG_SEQUENTIAL_SCAN,他们都慢了15%到20%,这意味着更多的时间来阅读和处理我的文件。 – Daniel

相关问题