我有一个Python应用程序,可以执行大文件的关联。它存储在一个字典中。根据输入文件的不同,此dict可能会变得非常大,直到它不再适合内存为止。这会导致系统挂起,所以我想阻止它。
我的想法是,总是存在与后续处理不相关的相关性。可以删除这些,而不会过多地改变整体结果。当我没有太多记忆时,我想这样做。
因此,我会定期检查可用内存。如果它变得太少(例如,小于300MB),如果删除不相关的相关性以获得更多空间。这就是理论。
现在我的问题是:在Python中,你不能在迭代它时从dict中删除它。但这正是我需要做的,因为我必须在删除之前检查每个dict条目的相关性。
通常的解决方案是创建dict的副本以进行迭代,或者创建一个仅包含我想要保留的元素的新dict。但是,dict可能是几GB,并且只剩下几百MB的可用内存。因此,我无法进行太多复制,因为这可能会再次导致系统挂起。
我在这里被困住了。谁能想到一个更好的方法来实现我的需求?如果在迭代时绝对不可能就地删除dict条目,那么可能有一些解决方法可以拯救我吗?
提前致谢!
编辑 - 有关dict的更多信息:
键是元组,指定数据相关的值。
值是包含相关日期的dicts。这些dicts的键总是字符串,值是数字(int或float)。
我通过将值 - 值中的数值与特定阈值进行比较来检查相关性。如果值低于阈值,则可以删除特定的相关性。
答案 0 :(得分:3)
我不认为你解决问题的方法是谨慎的。
如果您有这么多数据,我建议您在工具箱中找到一些更大的工具,建议让本地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)]
祝你好运!
答案 1 :(得分:0)
钥匙是否大?如果没有,您可以遍历dict以确定应删除哪些条目;将每个此类条目的密钥存储在列表中。然后遍历这些键并从字典中删除它们。