【问题标题】:I need to free up RAM by storing a Python dictionary on the hard drive, not in RAM. Is it possible?我需要通过在硬盘驱动器上而不是在 RAM 中存储 Python 字典来释放 RAM。可能吗?
【发布时间】:2010-08-03 14:41:30
【问题描述】:

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

感谢您的帮助!

【问题讨论】:

    标签: python


    【解决方案1】:

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

    如果货架对你来说不够强大,总有工业实力ZODB

    【讨论】:

      【解决方案2】:

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

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

      对于微妙的问题,例如考虑:

      x = d['foo']
      x.amutatingmethod()
      ...much later...
      y = d['foo']
      # is y "mutated" or not now?
      

      最后一条评论中问题的答案取决于d 是否是一个真正的字典(在这种情况下y 将被变异,实际上与x 完全相同的对象)或shelf (在这种情况下,y 将是与 x 不同的对象,并且与您上次保存d['foo']的状态完全相同!)。

      要让您的突变持续存在,您需要通过以下操作“将它们保存到磁盘”

      d['foo'] = x
      

      x 上调用任何你想要的修改器之后(所以特别是你不能只是这样做

      d['foo'].mutator()
      

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

      shelve 确实可以选择将所有获取的项目缓存在内存中,但是当然这会再次填满内存,并且最后关闭shelf 对象(因为所有缓存的项目都必须保存回磁盘,以防它们被变异)。该选项是我最初推动的(作为 Python 核心提交者),但后来我改变了主意,现在我为获得它而道歉(嗯,至少它不是默认的!-),因为案例应该在很少见的情况下使用它,而且它经常会困住粗心的用户......对不起。

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

      【讨论】:

        【解决方案3】:

        一遍又一遍地提取整个散列必然会遇到与您现在面临的相同的内存压力 - 可能更糟,所有数据来回编组。

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

        它们的行为很像哈希,对你来说应该是一个简单的过渡。

        【讨论】:

          【解决方案4】:

          """我有大约 6000 个实例化类的字典,其中每个类有 1000 个属性变量,所有类型为字符串或字符串列表""" ...我假设您的意思是:"""我有一个类大约有 1000 个属性,所有类型为 strliststr。我有一个字典,将大约 6000 个键未指定类型映射到该类的相应实例。""" 如果不是翻译合理,请指正。

          首先,一个类中的 1000 个属性令人难以置信。您必须使用value = getattr(obj, attr_name)setattr(obj, attr_name, value) 来处理绝大多数人。考虑使用字典而不是实例:value = obj[attr_name]obj[attr_name] = value

          其次,这 600 万个属性中有多少是“”?如果足够高,您可能想考虑使用__missing__ 钩子——docs here 实现一个没有物理条目的稀疏字典。

          【讨论】:

            猜你喜欢
            • 2016-11-02
            • 2018-01-20
            • 2019-09-28
            • 2010-12-18
            • 2018-09-24
            • 1970-01-01
            • 1970-01-01
            • 2016-07-27
            • 2017-08-29
            相关资源
            最近更新 更多