2010-09-20 94 views
1

我不得不處理大量通常不適合主內存的數據。我訪問這些數據的方式具有很高的局部性,因此將其緩存在內存中看起來是一個不錯的選擇。是否僅僅malloc()一個巨大的數組是可行的,讓操作系統找出哪些位分頁並保留哪些位?使用頁面文件進行緩存?

回答

6

假設數據來自文件,您最好關閉內存映射該文件。否則,你最終做的是分配數組,然後將數據從文件複製到數組中 - 並且由於數組映射到頁面文件,所以基本上只是將原始文件複製到頁面文件中,並且在這個過程中污染了「緩存」(即物理內存),因此當前活動的其他數據被驅逐的可能性更大。然後,當你完成後,你(通常)從數組中將數據寫回到原始文件中,在這種情況下(這意味着)將頁面文件複製回原始文件。

內存映射文件反而只是創建一些地址空間,並將其直接映射到原始文件。這樣可以避免將數據從原始文件複製到頁面文件(並在完成時再次返回),並且可以在從原始文件到頁面文件的路上將數據臨時移動到物理內存中。當然,最大的勝利在於/如果原始文件的實質部分根本沒有用到(在這種情況下,它們可能永遠不會被讀入物理內存,假設未使用的塊至少是一個頁面在尺寸方面)。

+0

我的數據不是來自一個文件,但這是我得到的最佳答案,它可能對其他人有用,所以我會接受它。 – 2011-02-03 23:23:58

0

如果數據在一個大文件中,請使用mmap來查看它。現代計算機有這麼多的RAM,你可能沒有足夠的交換空間可用。

+0

那麼在mmapped區域中操作它怎麼樣呢?它會執行嗎? – 2010-09-20 23:13:06

+0

當然,只要您觸摸的區域適合您的物理記憶,它就會非常快速。在退出時,或者在其他地方需要內存時,頁面將被寫回到文件中,但這對您而言是透明的。 – twk 2010-09-21 04:17:27