2011-05-07 75 views
5

我一直在研究一個涉及從文件中加載相對較大的字典到內存中的項目。字典有不到200萬個條目,每個條目(鍵值和組合值)都低於20個字節。磁盤上的文件大小爲38 MB。Python字典內存使用情況

我的問題是,當我嘗試加載字典時,我的程序立即擴展到超過2.5千兆字節的內存使用。

下面是我用讀字典從磁盤代碼:我認爲內存是用來解析字典語法AST

f = open('someFile.txt', 'r') 
rT = eval(f.read()) 
f.close() 
+0

你試過[pickle](http://docs.python.org/library/pickle.html)嗎? – MattH 2011-05-07 21:41:24

+0

鍵和值的類型是什麼? – 2011-05-07 21:48:50

回答

7

對於這種用途,如果您使用cPickle模塊而不是使用repr/eval,則會更好。

import cPickle 

x = {} 
for i in xrange(1000000): 
    x["k%i" % i] = "v%i" % i 
cPickle.dump(x, open("data", "wb"), -1) 

x = cPickle.load(open("data", "rb")) 

-1使用更有效,但可能不會向下兼容舊的Python版本兼容的最新協議傾銷手段的時候。如果這是一個好主意,取決於你需要轉儲/加載的原因。

+0

你可能也想使用json模塊 – 2011-05-07 21:50:07

+0

Shelve也是一個不錯的選擇。它專爲可能部分存儲在磁盤上的大型字典而設計。 – Nathan 2011-05-08 00:20:10

+0

謝謝!我還沒有機會實現這一點,但我讀了一點鹹菜,似乎應該解決這個問題。 – dckrooney 2011-05-08 17:53:11