2010-07-18 37 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