[英]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.