首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我需要通过在硬盘上存储Python字典来释放RAM,而不是在RAM中。有可能吗?

我需要通过在硬盘上存储Python字典来释放RAM,而不是在RAM中。有可能吗?
EN

Stack Overflow用户
提问于 2010-08-03 07:54:25
回答 4查看 2.2K关注 0票数 2

在我的例子中,我有一个包含大约6000个实例化类的字典,其中每个类都有1000个属性变量,类型都是字符串或字符串列表。当我建立这本字典的时候,我的RAM增长得非常快。有没有办法编写字典,因为它是建立在硬盘驱动器而不是RAM中,以便我可以节省一些内存?我听说过一种叫“泡菜”的东西,但我不知道这对我正在做的事情是不是一个可行的方法。

谢谢你的帮忙!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-08-03 08:06:43

也许您应该使用数据库,但请查看shelve模块

如果搁置对你来说还不够强大,总会有工业优势的

票数 5
EN

Stack Overflow用户

发布于 2010-08-03 08:36:25

正如@gnibbler推荐的那样,shelve无疑是我会使用的,但要注意两个陷阱:一个简单的陷阱(所有键都必须是字符串)和一个微妙的陷阱(因为值通常不存在于内存中,所以在它们上调用赋值函数可能不会像你预期的那样工作)。

对于简单的问题,通常很容易找到解决方法(如果你忘记并尝试,例如使用int或其他作为密钥,你会得到一个明显的异常,所以不难记住,你也需要一个解决方法)。

对于微妙的问题,请考虑以下示例:

代码语言:javascript
复制
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']!的完全相同的状态)。

为了让您的突变持久存在,您需要通过执行以下操作来“将它们保存到磁盘”

代码语言:javascript
复制
d['foo'] = x

x上调用任何你想要的赋值器之后(所以你特别不能这样做

代码语言:javascript
复制
d['foo'].mutator()

并期望突变“坚持”,就像如果d是一个字典一样)。

shelve确实可以选择在内存中缓存所有获取的项,但这当然会再次填满内存,并在最终关闭shelf对象时导致长时间的延迟(因为所有缓存的项都必须保存回磁盘,以防它们发生变化)。这个选项是我最初推动的(作为Python核心提交者),但后来我改变了主意,我现在为使用它而道歉(啊,好吧,至少它不是默认的!-),因为它应该用于的情况很少,而且它经常会诱使粗心大意的用户……抱歉的。

顺便说一句,如果你不知道一个赋值函数或“变异方法”是什么,它是任何改变你调用它的对象的状态的方法--例如,如果对象是一个列表,就是.append,如果对象是任何类型的容器,就是.pop,等等。当然,不必担心对象是否是不可变的(数字、字符串、元组、frozensets等),因为在这种情况下它没有可变的方法;-)。

票数 3
EN

Stack Overflow用户

发布于 2010-08-03 08:07:53

一次又一次地处理整个散列必然会遇到与您现在所面临的相同的内存压力--甚至可能更糟,因为所有的数据都会来回编组。

相反,使用类似于散列的磁盘数据库可能是最好的选择;有关在程序中使用dbm样式的数据库的快速介绍,请参阅此页面:http://docs.python.org/library/dbm

它们的行为足够像散列,这对你来说应该是一个简单的转换。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3392663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档