我使用Windows ReadFile函数按顺序读取4GB文件,使用FILE_FLAG_NO_BUFFERING。我使用64K的缓冲区,一切正常,但问题是我的数据在当前缓冲区的末尾和下一次读取之间被切断。例如,我有一个4字节浮点数的序列,当我到达最后一个浮点数时,当前缓冲区中只有三个字节,下一个字节将出现在下一个读缓冲区中。那我怎么办呢?我应该跟踪消耗的字节数以保留最后三个字节,然后在读取下一个缓冲区后追加最后一个字节吗?或者可能将缓冲区复制到另一个并在那里跟踪浮点数?但这并没有打败不用Windows缓存读取的优势?谢谢你的帮助。
答案 0 :(得分:0)
我认为在你处于边界的特殊情况下,你应该将前一个块中的位和下一个块中的位并排复制到一个小的空间中,并从那里读取它们。一块。当您不在边界时,您不需要使用此临时空间。
答案 1 :(得分:0)
不管怎样,你必须自己做这个会计,因为需要对齐无缓冲的读取。
但更好的问题是,为什么你认为你需要这样做?您是否尝试使用std::ifstream
来阅读文件?现代处理器和缓存大大有助于隐藏(或实际上消除)您可能认为缓冲I / O执行的额外副本。
此外,如果您按顺序阅读,FILE_FLAG_NO_BUFFERING
将禁止操作系统的预读机制。这几乎肯定会比绕过OS缓冲区所花费的成本高得多。
我怀疑您会发现最简单的代码对于大文件的顺序读取效果最佳。几乎就是现代系统在各个层面都进行了优化......