我需要優化我的應用程序的RAM使用情況。
請給我講課,告訴我編碼Python時不應該關心內存。我有一個內存問題,因爲我使用非常大的默認字典(是的,我也想快)。我目前的內存消耗是350MB並且在增長。我已經無法使用共享主機,並且如果我的Apache打開更多進程,則內存會增加一倍和三倍......並且它很昂貴。
我已經完成了廣泛的分析,我確切地知道我的問題在哪裏。
我有幾個具有Unicode密鑰的大型(> 100K條目)字典。字典從140字節開始並快速增長,但更大的問題是密鑰。 Python對內存中的字符串進行了優化(或者我已經閱讀過),以便查找可以進行ID比較('interning')。不知道這對於unicode字符串也是如此(我無法'實習'他們)。
存儲在字典中的對象是元組列表(an_object,int,int)。內存優化的Python技巧
my_big_dict [some_unicode_string] .append((my_object,an_int,another_int))
我已經發現,它是值得的分成幾個字典,因爲元組採取了很多的空間.. 。
我發現我可以在使用它們作爲鍵之前通過散列字符串來保存RAM!然後,不幸的是,我碰到了我的32位系統上的生日碰撞。 (側面的問題:我可以在32位系統上使用64位密鑰字典嗎?)
在Linux(生產)和Windows上均爲Python 2.6.5。 關於優化字典/列表/元組的內存使用的任何提示? 我甚至想過使用C - 我不在乎這個非常小的代碼是否很難看。這只是一個獨特的位置。
提前致謝!
2個小評論:我真的很喜歡開箱即用的系統級答案,但是它們(例如數據庫,即使是緩存)真的可以在性能上與Python字典進行比較嗎?我正在運行實時算法,字典速度不夠快。我一定會嘗試memcached和Redis(很酷),但是進程間通信對我來說足夠快嗎? (對不起,現在就添加這個,很難優化內存和速度......) 另外,我的字典大部分是隻讀的。我能否以某種方式使用這些知識? – 2010-06-11 10:59:10
「PEP 412:密鑰分享字典」可能會引起您的興趣。我相信它包含在Python 3.3中http://www.python.org/dev/peps/pep-0412/ – bcoughlan 2013-08-13 23:13:09
@bcoughlan非常酷,謝謝!可悲的是我需要等待2.7回程。 – 2013-08-15 07:46:31