我有一種情況,需要使用大(幾百MB)數據結構的數字(15-30)。他們不會同時適應所有的記憶。更糟糕的是,對它們進行操作的算法可以在所有這些結構上工作,即不是第一種,然後是其他等等。我需要儘可能快地完成這些。內存映射文件性能 - 使用大型數據集時的內存管理
所以我想我會分配內存在磁盤上,基本上是直接二進制表示的數據,當它被加載到內存中的文件,並使用內存映射文件來訪問數據。我使用例如50兆的mmap'views'(一次將50 MB的文件加載到內存中),所以當我有15個數據集時,我的進程使用750 MB的內存來存儲數據。最初(測試)確定的是,當我獲得更多數據時,我會以一定的速度調整50 mb。
然而,這種啓發式算法現在是硬編碼的(我知道我將測試的數據集的大小)。 「在野外」,我的軟件需要能夠確定分配的「正確」內存量,以最大限度地提高性能。我可以說'我將以500 MB的內存使用爲目標',然後將500除以數據結構的數量以達到mmap視圖的大小。我發現當試圖設置這個'目標內存使用率'太高時,虛擬內存管理器磁盤抖動將(幾乎)鎖定機器並使其不可用,直到處理完成。這是在我的「生產」解決方案中要避免的。
所以我的問題,都有些不同的方法的問題:
什麼是單個進程的「最好」的目標尺寸是多少?我是否應該儘量使我擁有的2GB(假設32位Win XP及更高版本,現在不支持/ 3GB)或儘量縮小我的進程以便我的軟件不會佔用機器?當我的計算機上有2個Visual Studio,Outlook和Firefox打開時,那些使用1/2 GB的虛擬內存很容易 - 如果我讓我的軟件使用2 GB虛擬內存,交換將嚴重降低計算機的速度。但是,如何做我確定'最好'的過程大小。
如何在使用內存映射文件時保持機器的性能?我的應用程序對數據進行了相當簡單的數字操作,這基本上意味着它可以快速地將數百兆字節的數據壓縮,導致整個內存映射文件(幾千兆字節)被加載到內存中,並再次非常快速地重新換出(想想蒙特卡羅風格模擬)。
有沒有機會不使用內存映射文件,只使用fseek/fgets會比使用內存映射文件更快或更少侵入?
我可以閱讀的任何文章,論文或書籍?無論是「食譜」風格的解決方案還是基本概念。
謝謝。
規格爲64位操作系統,問題解決。 – 2010-10-29 14:49:17
是的,希望我能在幾年內做到這一點...... – Roel 2010-10-29 14:55:18
@Hans - 今天64位和32位的普及率是多少?這似乎是限制性的,也許在10年內這是合理的。 – 2010-10-29 14:55:47