【问题标题】:ReadFile FILE_FLAG_NO_BUFFERING how to read data between two sectorsReadFile FILE_FLAG_NO_BUFFERING 如何在两个扇区之间读取数据
【发布时间】:2011-10-31 11:02:26
【问题描述】:

我正在使用 Windows ReadFile 函数通过 FILE_FLAG_NO_BUFFERING 顺序读取 4GB 文件。我正在使用 64K 的缓冲区,一切正常,但问题是我的数据在当前缓冲区的末尾和下一次读取之间被剪切。例如,我有一个 4 字节浮点数序列,当我到达最后一个浮点数时,当前缓冲区中只有三个字节,下一个字节将进入下一个读取缓冲区。那么我该如何处理呢?我是否应该跟踪消耗的字节数以保留最后三个字节,然后在读取下一个缓冲区后附加最后一个字节?或者也许将缓冲区复制到另一个缓冲区并在那里跟踪浮动?但这不会破坏不使用 Windows 缓存读取的优势吗?感谢您的帮助。

【问题讨论】:

    标签: c++ windows-xp


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      无论哪种方式,您都必须自己进行统计,因为需要对齐无缓冲读取。

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

      另外,如果您按顺序阅读,FILE_FLAG_NO_BUFFERING 将禁止操作系统的预读机制。几乎可以肯定,这将花费您远远超过绕过操作系统缓冲区所获得的收益。

      我怀疑您会发现最简单的代码最适合顺序读取大文件。这几乎就是现代系统在各个级别上都进行了优化的情况......

      【讨论】:

      • 感谢您的回答。我一直在阅读有关 FILE_FLAG_NO_BUFFERING 的信息,建议在阅读大文件时使用,比如超过 1GB。在那种情况下,缓存管理器无法很好地处理缓存。事实上,我用 FILE_FLAG_SEQUENTIAL_SCAN 尝试了 ifstream 和 ReadFile,它们的速度都慢了 15% 到 20%,这意味着要多花一分钟左右的时间来读取和处理我的文件。
      猜你喜欢
      • 2015-09-29
      • 2017-01-29
      • 2010-12-17
      • 1970-01-01
      • 2013-07-10
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多