2010-07-18 71 views
6

可能重复:
How to invalidate the file system cache?如何强制Windows清除所有磁盘读取缓存数据?

我正在写一个磁盘密集型Win32程序。它首次运行时,运行速度会比使用FindFirstFile()/ FindNextFile()扫描用户文件夹时慢得多。

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

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

+1

+1我正在轮到自己张贴相关的帖子。当试图解决磁盘相关算法的性能问题时,缓存确实会阻碍。好问题。 – 2010-07-18 15:55:54

回答

0

我试过的答案,包括CacheSet所有方法,但他们不会为用FindFirstFile/FindNextfile工作()。这是什么工作:

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

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

+1

要注意的是,Windows SMB客户端和Windows SMB服务器都有自己的缓存,然后您正在处理(以及HDD和其他缓存,SAN级别,RAID控制器......)。您最好的选择,因为CacheSet的魔术不起作用(我同意),是“洪水缓存”,以便清除以前的条目。这就是说,您必须计算出所有涉及的缓存的大小并填充它们,以便您先前读取/写入的数据被推出(或刷新到稳定的存储)。请参阅HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ lanmanserver \ parameters reg_dword:TreatHostAsStableStorage。 – mbrownnyc 2011-08-18 18:15:12

0

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

+1

这不起作用。主机操作系统最终也做了缓存,这使得测试不准确。 – 2011-11-12 17:54:54

1

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

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

+0

这正是我一直所做的。一个简单的方法是打开一个大文件并搜索文件中不存在的一系列字节。 Windows将用新文件泛滥缓存并推出旧数据。这不是理想的,但它的工作原理。 – Synetech 2013-12-01 02:01:32

3

你有没有想过在不同的卷上做这件事,并卸下/重新安装卷?这将导致绝大多数的一切都从磁盘重新读取(尽管缓存在那里并不在意)。

+0

+1 - 这是唯一可以保持一致的方法。 – 2011-11-12 17:55:13

1

退房通过的Sysinternals的CacheSet的清除功能。

+0

我在Windows XP上试过它,通过磁盘文件夹枚举的速度与之前清除缓存一样快,所以它似乎不起作用。 – 2010-09-01 14:47:14