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

可能重复:
如何使文件系统caching失效?

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

如何在不重新启动的情况下重复第一次演奏? 有没有办法强制系统丢弃磁盘caching中的所有内容?

我知道,如果我正在读取单个文件,则可以通过将FILE_FLAG_NO_BUFFERING标志传递给CreateFile()的调用来禁用caching。 但是在search文件时这样做似乎不可能。

你有没有想过在不同的卷上做这个,然后卸下/重新安装卷? 这将导致绝大多数的一切都从磁盘重新读取(虽然缓存在那里不会在乎)。

您需要创建足够的内存压力,以使内存管理器和缓存管理器放弃之前的缓存结果。 对于高速缓存管理器,可以尝试打开启用了高速缓存的大型文件(即大于物理内存)文件,然后向后读取(以避免任何连续的I / O优化)。 虚拟机和缓存管理器之间的交互更复杂一些,更依赖于操作系统版本。

控制器上也有高速缓存(可能,但不太可能)和磁盘驱动器本身(可能)。 有特定的IoCtls刷新此缓存,但以我的经验,磁盘固件未经测试在这个舞台上。

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

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

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

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

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