簡體   English   中英

我需要通過在硬盤驅動器上存儲Python字典來釋放RAM,而不是在RAM中。 可能嗎?

[英]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模塊

如果貨架不夠強大,那么ZODB總是存在工業強度

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的類屬性所有類型的strliststr ,我對未指定類型的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM