[英]I need to free up RAM by storing a Python dictionary on the hard drive, not in RAM. Is it possible?
在我的例子中,我有一個大約6000個實例化類的字典,其中每個類有1000個屬性變量,所有類型字符串或字符串列表。 當我建立這個詞典時,我的RAM上升得非常高。 有沒有辦法寫字典,因為它是建立在硬盤驅動器而不是RAM,以便我可以節省一些內存? 我聽說過一種叫做“泡菜”的東西,但我不知道這對我正在做的事情是否可行。
謝謝你的幫助!
shelve
,正如@gnibbler推薦的那樣,我無疑會使用它,但要注意兩個陷阱:一個簡單的陷阱(所有鍵必須是字符串)和一個微妙的陷阱(因為值通常不存在於內存中,調用對他們的改變者可能無法按預期工作)。
對於這個簡單的問題,通常很容易找到一個變通方法(如果你忘記並嘗試使用int
或其他任何鍵作為鍵,你會得到一個明確的異常,因此不難記住你確實需要一個解決方法)。
對於微妙的問題,請考慮例如:
x = d['foo']
x.amutatingmethod()
...much later...
y = d['foo']
# is y "mutated" or not now?
最后評論中問題的答案取決於d
是否是真正的dict(在這種情況下y
將被突變,實際上與x
完全相同的對象)或shelf
(在這種情況下y
將是一個獨特的對象x
,並且恰好處於你上次保存到d['foo']
!)。
為了讓你的突變持續存在,你需要通過這樣做“將它們保存到磁盤”
d['foo'] = x
在x
上調用你想要的任何mutator之后(特別是你不能這么做)
d['foo'].mutator()
並期望突變“堅持”,就像d
dict一樣。
shelve
確實有一個選項可以將所有獲取的項目緩存在內存中,但當然可以再次填滿內存, 並在最終關閉shelf
對象時導致長時間延遲(因為所有緩存的項目必須保存回磁盤然后,以防它們發生變異)。 這個選項是我最初推動的(作為Python核心提交者),但我已經改變了主意,現在我為它進入道歉道歉(好吧,至少它不是默認的! - ),因為它的情況應該用於罕見的,它可以經常陷阱粗心的用戶...抱歉。
順便說一下,如果你不知道什么是mutator或者是“mutating method”,那么它就是改變你調用它的對象狀態的任何方法 - 例如.append
如果對象是一個列表, .pop
if對象是任何類型的容器,依此類推。 當然,如果對象是不可變的,則無需擔心(數字,字符串,元組,凍結......),因為在這種情況下它沒有變異方法;-)。
一遍又一遍地腌制整個哈希必然會遇到你現在面臨的相同內存壓力 - 可能更糟糕的是,所有數據來回聚集。
相反,使用像哈希一樣的磁盤數據庫可能是最好的選擇; 有關在程序中使用dbm樣式數據庫的快速介紹,請參閱此頁面: http : //docs.python.org/library/dbm
它們的行為就像哈希一樣,它應該是一個簡單的過渡。
msgstr“”“我有一個大約6000個實例化類的字典,其中每個類有1000個屬性變量,所有類型字符串或字符串列表”“”......我猜你的意思是:“”“我有一個大約1000的類屬性所有類型的str
或list
的str
,我對未指定類型的 6000個鍵的字典映射到相應的該類的實例。“””如果這不是一個合理的翻譯,請更正。
首先,類中的1000個屬性是令人難以置信的。 您必須使用value = getattr(obj, attr_name)
和setattr(obj, attr_name, value)
來處理絕大多數。 考慮使用dict而不是實例: value = obj[attr_name]
和obj[attr_name] = value
。
其次,這600萬屬性中有多少百分比是“”? 如果足夠高,您可能會考慮使用__missing__
hook - docs來實現一個稀疏的dict,它實際上沒有這些屬性的條目。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.