使 OS 磁盘读取缓存无效

Posted

技术标签:

【中文标题】使 OS 磁盘读取缓存无效【英文标题】:Invalidate OS disk read cache 【发布时间】:2010-11-03 09:00:37 【问题描述】:

我正在尝试比较 Windows 程序在磁盘缓存处于最佳状态时的性能(当程序运行所需的所有文件都在内存缓存中时,我只是多次运行以获得此状态),当缓存处于最坏状态时,它是完全空的。

我知道确保缓存完全为空的唯一方法是重新启动计算机,但这并不理想,因为它需要太多时间。有没有办法在不重新启动的情况下做到这一点?我尝试了同步,但它不会使读取缓存无效...

【问题讨论】:

【参考方案1】:

在您对CreateFile 的调用中,包括FILE_FLAG_NO_BUFFERING 标志。有关详细信息,请参阅 MSDN 上的 CreateFile reference page。特别注意requirements。

如果修改代码来执行此操作太费力,请尝试编写一个简单的实用程序来读取大于物理内存的文件。这可能足以从文件系统缓存中刷新您关心的文件。

【讨论】:

带有此标志的 CreateFile 似乎工作正常,但我正在寻找一种方法来为整个文件夹(和子文件夹)执行此操作。我真的希望我不应该遍历每个文件,因为我认为文件夹中有几百万个文件需要无效。关于编写一个读取大文件的实用程序,我如何保证它会清空缓存?也许Windows以一种不会缓存所有大文件的方式管理其缓存,并为更多文件保留一些空间。或者也许不是......实际上我不知道。不管怎样,我会试一试,看看结果。 如果您正在遍历大量文件,您不会只有少量的 CreateFile 调用来添加该标志吗?这是打开文件进行读取的一部分,而不是一个两步过程,您可以使缓存(对于该文件)无效,然后打开它。

以上是关于使 OS 磁盘读取缓存无效的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 OS 和磁盘缓冲区写入文件后读取操作更快?

硬盘驱动器磁盘读取缓存

几个io术语

使毕加索中的缓存无效

sqlserver 中一些常看的指标和清除缓存的方法

如何使文件系统缓存无效?