2012-02-13 36 views
3

您需要一個10^10 4個字節的整數數組作爲查找表。加載到RAM將需要40GB,這是不可行的。初始化完成後,您永遠不需要寫入該數組。您需要從單個進程的多個線程同時讀取此數組中隨機位置的單個整數值。你保證在64位平臺上。這個查詢表的最快實現是什麼?使用常規文件讀取功能或例如提升內存映射文件?基於文件的查找表

+0

這個數組假設要存儲/做什麼? – 2012-02-13 21:20:19

+0

對於隨機訪問,我猜想定期流IO。如果沒有訪問模式,內存映射不會有太大幫助,並且它不適合(大部分)在RAM中(據我所知)。 – 2012-02-13 21:20:40

+0

@Jim Fell:該數組用於將索引值x映射到f(x),其中f是非常慢的函數,因此它不能在運行時使用。 – zeroes00 2012-02-13 21:29:15

回答

1

這聽起來像你應該做明確的讀取。內存映射可以避免一次導入大量頁面(我相信Windows對256KiB的支持,對其他平臺不太確定),並允許您在第一次使用後不會再受到任何處罰,從而重新訪問它們。

如果您只是從隨機位置讀取整數,您將以256KB讀取一頁中僅4個字節,甚至可能無法重新訪問它。太浪費了!另外還要考慮你還從其他應用程序和文件系統緩存中分出了很多可能有用的數據。

1

由於文件一旦創建,你只需要以只讀的方式訪問它,我不認爲你會想要一個內存映射文件,升壓或其他費用。如果您有多個想要併發訪問相同數據的進程,那將會更有用。在你的情況下,你只有只讀線程,所以一個簡單的40g文件應該是最簡單和最快的。