2014-02-12 66 views
0

我有一個Python應用程序執行關聯大型文件。它將這些存儲在字典中。根據輸入文件的不同,這個字典可能會變得非常大,直到它不再適合內存。這會導致系統掛起,所以我想防止這種情況發生。Python:從字典中刪除就地

我的想法是,總是有它不是爲以後處理等等相關關係。這些可以刪除,而不會改變整體結果太多。當我沒有太多內存的時候,我想這樣做。

因此,我會定期檢查可用內存。如果它變得太少(比如說小於300MB),如果刪除不相關的關聯以獲得更多的空間。這就是理論。

現在我的問題:在Python中,你不能從一個字典,而迭代它刪除。但這正是我需要做的,因爲在刪除之前我必須檢查每個字典條目的相關性。

通常的解決辦法是創建字典的副本迭代,或創建一個包含只是我想保留元素的新字典。但是,字典可能會有幾GB大,剩下的可用內存只有幾百MB。所以我不能複製,因爲這可能會導致系統掛起。

在這裏,我卡住了。任何人都可以想出一個更好的方法來實現我所需要的嗎?如果在迭代過程中就地刪除字典條目是絕對不可能的,那麼可能有一些解決方法可以救我?

在此先感謝!

EDIT - 有關的dict一些更多的信息:

鍵是元組指定由該數據是相關的值。

這些值是包含相關日期的字典。這些字符串的鍵總是字符串,值是數字(int或float)。

我通過在價值http://stardict.sourceforge.net/Dictionaries.php下載與某個閾值進行比較的數值檢查相關性。如果這些值低於閾值,則可以放棄特定的相關性。

+0

什麼是字典值類型,以及如何檢查相關性? – bereal

+0

我已將此信息添加到原始帖子。 – j0ker

+0

這些價值詞典中的鍵是否已修復?如果是這樣,你是否考慮過內存分貝而不是字典,比如sqlite? – bereal

回答

2

我不認爲你對問題的解決方案是謹慎的。

如果你有那麼多的數據,我建議你找到你的工具箱中一些較大的工具,一個建議是讓本地的Redis服務器爲您排憂解難。

看看redis-collections,這將爲您提供一個像一個Redis的後端對象字典,給你一個可持續的解決方案。

>>> from redis_collections import Dict 
>>> d = Dict() 
>>> d['answer'] = 42 
>>> d 
<redis_collections.Dict at fe267c1dde5d4f648e7bac836a0168fe {'answer': 42}> 
>>> d.items() 
[('answer', 42)] 

祝你好運!

+0

謝謝,這將是一個解決方案。您能否預測相關性能會有多糟糕,因爲我也必須訪問硬盤驅動器? – j0ker

+0

因爲性能會降低一點,但是由於Redis非常高效,並且使用了memcaching,所以我認爲這不會成爲問題。 – brunsgaard

+0

@ j0ker,如果您嘗試Redis解決方案,請分享您的發現?已經有了 – brunsgaard

0

鑰匙大嗎?如果沒有,您可以循環查看該詞典以確定應刪除哪些條目;將每個此類條目的密鑰存儲在列表中。然後循環這些鍵並從字典中刪除它們。