2010-08-26 56 views
8

可能重複:
How to invalidate the file system cache?如何在Windows下刷新磁盤讀取緩存?

爲了能夠使一些基準,我需要清理的Windows磁盤讀取緩存。我怎樣才能做到這一點?

其實我是想,如果加載一個大的Unicode文件從磁盤(UTF-8或UTF-16)是快還是不行,考慮到在記憶我保存UTF-16進行比較。

我知道它應該沒有顯着差異,但爲了進行基準測試,我需要確保該文件沒有被緩存 - 我需要查看磁盤上的大小是否比解碼文件有更多或更少的影響。

+0

你在找什麼也被稱爲「丟棄緩存」。在Linux下,你可以通過寫入'/ proc/sys/vm/drop_caches'來完成。不知道Windows雖然... – sleske 2010-08-26 10:50:51

+0

@Mehrdad你確實意識到這個問題,如果從2010年和2011年的一個? – Jack 2012-12-14 00:37:32

+0

@Jack:是的,對不起,我確實做到了,但在同一時間,我的答案posteed這個問題上的其他問題在幾個月前......所以無論這個問題應該被關閉,因爲這一個愚弄的人,或者相反。我決定選擇後者,因爲當我谷歌搜索時,我看到*噸這個問題的副本(很多來自2010年),並認爲將它們全部標記爲一個愚蠢的問題比嘗試將它少很多,在StackOverflow上找到這個問題的最早副本(有噸)。 :\ Sorry .. – Mehrdad 2012-12-14 00:58:35

回答

3

AFAIK,這是不幸的是沒有可能丟棄讀取Windows下緩存。我花了一些時間尋找到這個幾年前,只發現瞭如何沖洗緩存。

在我看來,你有三種選擇,除非別人已經發現了一些魔法:

  1. 如果可能的話,做你讀文件I/O在非緩衝模式。
  2. 每次您想要進行基準測試時,在創建新副本時創建指定無緩衝模式的測試數據的新副本(此應該將副本從讀緩存中取出,但我沒有測試過)。
  3. 分配足夠的內存Windows已丟棄的磁盤緩存(啊!)。

編輯:它確實有可能刷新讀緩存,至少在Vista和更高版本:Disable or flush page cache on Windows。不過,它需要調用未記錄的NtSetSystemInformation NT API。另外,對於單個文件,只需打開指定的FILE_FLAG_NO_BUFFERING並再次關閉句柄即可刷新讀取緩存。從微軟

+1

請注意,Sron Sbarnea答案中的'flushmem'實現瞭解決方案3.它可以工作,但分配這麼多內存顯然非常慢(可能是因爲它會導致大量的分頁/交換)。 – sleske 2010-08-30 10:51:59

+1

@sleske:是的,這不是一個漂亮的解決方案 - 它迫使Windows修剪所有進程的工作集,做頁面交換......然後通常會立即進行頁面活動。 – snemarch 2010-08-30 11:01:18

+1

'請注意,Sron Sbarnea答案中的flushmem實現瞭解決方案3.它可以工作,但分配這麼多內存顯然非常慢(可能是因爲它會導致大量的分頁/交換)。「更不用說它可能會導致系統崩潰。我運行它,Chrome(包括這個頁面)剛剛消失。衛生署!幸運的是,當我運行Chrome時,它讓我恢復了會話,所以這只是一個小小的不便。儘管如此,被建議是安全的,你應該在使用它之前退出所有的東西(這當然是一個糟糕的解決方案)。 ': - /' – Synetech 2013-12-01 00:59:31

3

有人幫我這個在幾年前(在Windows XP的天回),並給了我,當時遇到了我的需求的解決方案。我的機器中已經有兩個驅動器,我需要測試的東西已經放在D驅動器上,幸運的是,當我想要刷新緩存時,我不需要在D驅動器上保留任何文件。在Windows磁盤管理界面中,我可以將我的D:驅動器盤符更改爲另一個盤符,然後再重新啓動,並且D驅動器將執行操作,就好像在操作系統中有一個冷藏緩存。