2010-03-10 91 views
3

我有一個python程序,要吃大量的內存,主要是在字典中。這個詞典將負責爲一個非常大的鍵集分配一個唯一的整數值。當我處理大型矩陣時,我需要一個鍵 - 索引對應關係,也可以從中恢復(即一旦矩陣計算完成,我需要將這些值映射回原始鍵)。操作系統如何處理比內存大的python字典?

我相信這個數量最終會超過可用內存。我想知道如何處理交換空間。也許爲此目的有更好的數據結構。

+0

比物理內存大嗎?比交換文件大? 「可用內存」是什麼意思? – 2010-03-10 20:19:41

回答

0

它只會在交換垃圾中結束,因爲散列表具有非常隨機的內存訪問模式。

如果您知道地圖超出了物理內存的大小,您可以考慮首先在磁盤上使用數據結構。這尤其適用於在計算過程中不需要數據結構的情況。當哈希表觸發交換時,它在哈希表本身之外也會產生問題。

+2

「打亂」你的意思 – aehlke 2010-04-07 19:45:40

5

如果數據超過內存,則需要一個數據庫。當字典大於內存時,字典的索引設計不是爲了獲得良好的性能。

1

交換空間是內核功能和用戶透明(python)。

如果你有一個巨大的字典,並不需要一次所有的數據,你可以看看redis這可能會做你想做的。或者可能不是:)

0

據我所知,當一個字典擴展時,它只依賴於C的malloc。只要malloc保持成功,程序將繼續運行。只要有足夠的內存,大多數操作系統會保持malloc工作,然後只要有可交換的頁面。無論哪種情況,Python會在malloc失敗時拋出MemoryError異常,如documentation。就數據結構而言,字典將在空間方面非常有效。要真正做得更好的唯一方法是使用分析函數來來回映射值。