繁体   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