簡體   English   中英

從內存中驅逐只讀內存映射頁面?

[英]Evicting read-only memory mapped pages from memory?

我有一些巨大的二進制文件,目前正在使用Windows上的內存映射讀取這些文件。 一切正常,但是當文件大小大於內存時,問題就開始了。 例如,在24 GiB內存機器上,我映射了64 GiB文件,然后通過它進行或多或少的流式讀取(不是完全流式傳輸,但還可以)。盡管如此,該過程最終占用了所有內存一點。

我只觸碰了文件中的每個字節一次,因此應該保持4-5 GiB左右以獲得最佳性能。 有沒有一種方法可以強制Windows(7)放棄頁面? FlushViewOfFile僅丟棄頁,但在我的用例中,我僅從文件中讀取。 我已經設置了NO_BUFFER標志,但是我希望能夠以某種方式降低頁面優先級,以便更快地將它們逐出。 現在,一旦內存已滿,隨着Windows對所有內容進行分頁,該應用程序將停止運行。

[編輯]它是64位Windows上的64位應用程序。

不要將所有內容都映射為一個視圖。 調用一次CreateFileMapping ,然后在需要文件段時調用MapViewOfFileUnmapViewOfFile UnmapViewOfFile應該導致頁面被丟棄。

當然,您可以一次從同一個文件映射中獲得多個視圖,它們可以重疊或不重疊,並且重疊的視圖將是連貫的(即使在不同的文件映射和不同的過程中)。

另一個選擇是VirtualUnlock您知道一段時間不會使用的頁面。 如果當前未鎖定頁面,則VirtualUnlock會將其從工作集中刪除,並將它們放置在待機列表中,就像您取消映射它們一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM