我一直在研究一個涉及從文件中加載相對較大的字典到內存中的項目。字典有不到200萬個條目,每個條目(鍵值和組合值)都低於20個字節。磁盤上的文件大小爲38 MB。Python字典內存使用情況
我的問題是,當我嘗試加載字典時,我的程序立即擴展到超過2.5千兆字節的內存使用。
下面是我用讀字典從磁盤代碼:我認爲內存是用來解析字典語法AST
f = open('someFile.txt', 'r')
rT = eval(f.read())
f.close()
我一直在研究一個涉及從文件中加載相對較大的字典到內存中的項目。字典有不到200萬個條目,每個條目(鍵值和組合值)都低於20個字節。磁盤上的文件大小爲38 MB。Python字典內存使用情況
我的問題是,當我嘗試加載字典時,我的程序立即擴展到超過2.5千兆字節的內存使用。
下面是我用讀字典從磁盤代碼:我認爲內存是用來解析字典語法AST
f = open('someFile.txt', 'r')
rT = eval(f.read())
f.close()
。
對於這種用途,如果您使用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版本兼容的最新協議傾銷手段的時候。如果這是一個好主意,取決於你需要轉儲/加載的原因。
這可能有點偏離主題,但它也可以幫助在處理大文件/數據流時大量使用生成器表達式。
This discussion explains it very well和this presentation改變了我寫我的程序的方式。
你試過[pickle](http://docs.python.org/library/pickle.html)嗎? – MattH 2011-05-07 21:41:24
鍵和值的類型是什麼? – 2011-05-07 21:48:50