微小读取(重叠,缓冲)的解释优于大型连续读取?

时间:2011-05-06 09:21:59

标签: windows winapi overlapped-io buffered

1 个答案:

答案 0 :(得分:6)

我不是文件系统专家,但我认为这里有很多事情要做。首先。 w.r.t.你对内存映射的评论是赢家。这并不奇怪,因为NT缓存管理器基于内存映射 - 通过自己进行内存映射,您可以复制缓存管理器的行为而无需额外的内存副本。

当您从文件中按顺序读取时,缓存管理器会尝试为您预取数据 - 因此您可能会在缓存管理器中看到readahead的影响。在某些时候,缓存管理器停止预取读取(或者更确切地说,在某些时候,预取的数据不足以满足您的读取,因此缓存管理器必须停止)。这可能是您所看到的较大I / O速度放缓的原因。

您是否尝试过将FILE_FLAG_SEQUENTIAL_SCAN添加到CreateFile标志中?这指示预取者更具攻击性。

这可能违反直觉,但传统上从磁盘读取数据的最快方法是使用异步I / O和FILE_FLAG_NO_BUFFERING。当你这样做时,I / O直接从磁盘驱动器进入你的I / O缓冲区,没有任何东西妨碍(假设文件的段是连续的 - 如果它们不是,文件系统将不得不发出几个磁盘读取以满足应用程序读取请求)。当然,这也意味着你丢失了内置的预取逻辑并且必须自己滚动。但是使用FILE_FLAG_NO_BUFFERING,您可以完全控制I / O管道。

还有一点要记住:当您进行异步I / O时,确保始终有I / O请求非常重要 - 否则您将失去最后一个I / O完成与下一个I / O之间的潜在时间I / O已启动。