如何强制Windows清除所有磁盘读取缓存数据?

时间:2010-07-18 15:34:33

标签: windows winapi

  

可能重复:
  How to invalidate the file system cache?

我正在编写磁盘密集型win32程序。第一次运行时,它使用FindFirstFile()/ FindNextFile()扫描用户的文件夹时运行速度慢很多。

如何在不重启的情况下重复首次演出?有没有办法强制系统丢弃其磁盘缓存中的所有内容?

我知道如果我正在读取单个文件,我可以通过将FILE_FLAG_NO_BUFFERING标志传递给对CreateFile()的调用来禁用缓存。但是在搜索文件时似乎无法做到这一点。

5 个答案:

答案 0 :(得分:3)

您是否考虑过在不同的音量上进行操作,以及拆卸/重新安装音量?这将导致绝大多数所有内容都从磁盘重新读取(虽然缓存下来不会关心)。

答案 1 :(得分:1)

您需要创建足够的内存压力,以使内存管理器和缓存管理器丢弃以前的缓存结果。对于缓存管理器,您可以尝试在启用缓存的情况下打开一个较大的(即物理RAM大于物理RAM)文件,然后向后读取它(以避免任何顺序I / O优化)。 vm和缓存管理器之间的交互稍微复杂一些,并且更依赖于os版本。

控制器上也有缓存(可能,但不太可能)和磁盘驱动器本身(可能)。有特定的IoCtls来刷新这个缓存,但根据我的经验,磁盘固件在这个领域尚未经过测试。

答案 2 :(得分:1)

通过SysInternals查看CacheSet的清除功能。

答案 3 :(得分:0)

您可以使用虚拟机避免物理重启。

答案 4 :(得分:0)

我尝试了答案中的所有方法,包括CacheSet,但它们不适用于FindFirstFile / FindNextfile()。这是有用的:

  • 通过网络扫描文件。扫描共享驱动器时,似乎Windows不会缓存文件夹,因此每次都很慢。

  • 使任何算法变慢的最简单方法是插入对Sleep()的调用。这可以揭示多线程代码中的许多问题,这就是我真正想要做的事情。