2010-08-19 86 views
1

我有一個內存映射文件,並在當前提交的視圖中的頁面。我想解除它。 MapViewOfFile告訴我我無法在文件映射頁面上使用VirtualFree。有其他方法可以做到嗎?如何取消文件映射頁面?

回答

1

你不能decommit,但你真正想要的是不是decommitting它...

你真正想要的是從內存中釋放出來的頁面。這可以通過使用VirtualUnlock來完成。請參閱VirtualUnlock Remarks

在未鎖定的內存範圍內調用VirtualUnlock將從進程的工作集中釋放頁面。

注意:如文檔所述,函數將返回FALSE(頁面未鎖定),並且GetLastError將返回ERROR_NOT_LOCKED。

這在Guillermo Prandi's question CreateFileMapping, MapViewOfFile, how to avoid holding up the system memory中描述。

備註:我認爲你可以通過這種方式查看它:取消映射的頁面是荒謬的 - 只要它被物理存儲支持,無論是內存還是文件,頁面都會被提交。文件映射頁面在這個意義上不能被解除,因爲它總是會被文件支持。


然而,在the question mentioned代碼測量內存佔用量,但究竟是措施不具代表性,因爲實際上的頁面從進程工作集中刪除並不一定意味着它不再出現在一個記憶。

我已經執行了一個不同的實驗,測量從存儲器映射頁面讀取一個字節需要多長時間。解鎖頁面或取消映射視圖並關閉映射句柄後,訪問速度仍然很快。

對於訪問速度較慢(即真的從內存中丟棄頁面),有必要取消映射視圖並關閉內存映射句柄和文件句柄(最後一個令我感到意外,因爲我期望取消映射查看和關閉映射句柄就足夠了)。

仍然有可能系統將VirtualUnlocked作爲一個提示,並且一旦它需要放棄某些內容,它就會立即丟棄這些頁面,但這是我必須考慮的事情,但如何證明。

+0

我已經進行了一項實驗,到目前爲止我找不到結果。我將在答案中直接描述它。 – Suma 2010-08-19 19:41:46