2017-01-26 33 views
0

我想mmap一個大文件進入內存,並順序解析它。據我瞭解,如果字節一度被懶惰地讀入內存,他們會留在那裏。有沒有辦法定期告訴系統釋放先前讀取的內容?閱讀mmapped數據內存高效

回答

1

這種理解只是一個非常膚淺的觀點。 要了解真正發生的情況,您必須考慮過程的虛擬內存與機器的實際內存之間的差異。映射一個巨大的文件意味着在虛擬地址空間中保留空間。如果在這一點上已經閱讀了任何內容,那麼這可能與平臺有關。當您實際訪問數據時,操作系統必須填充實際的內存頁面。當您訪問其他部件時,這些部件必須被帶入內存。當它重新使用內存時,完全取決於操作系統。通常情況下,當您或其他進程訪問某些數據並且沒有可用內存時會發生這種情況。但隨時都可能發生。如果您稍後再次訪問它,它可能仍在內存中,或者會被操作系統帶回。沒有辦法讓你的過程分清差異。

總之:你不需要關心這一點。操作系統管理所有在後臺。

有一點可能是,如果你映射一個非常大的文件,這會佔用虛擬地址空間中的空間,這是有限的。所以如果你處理很多巨大的映射和巨大的分配,你可能只想在給定的時間映射文件的一部分。

ADDITION:在想了一下之後,我想出了一個理由,爲什麼它可能更智能地進行分段順序。儘管我懷疑你能夠衡量這一點。 任何合理OS將尋找一個塊卸載時,需要在類似如下的命令:

  1. 未映射文件(不再需要)
  2. LRU未修改映射文件(可以從光盤檢索)
  3. LRU改性映射文件(與2,但需要在卸載前盤被更新)
  4. LRU分配的內存(需要被寫入到交換)

所以取消映射塊的已知在你不去的時候再次使用它,你會給操作系統一個提示,告訴它們應該儘早釋放它們。這會給最近使用的數據,但可能在將來訪問的數據留在內存中的機會更大。

+0

'總之你:你不需要關心那件事。操作系統在後臺管理。「這更好。謝謝! –