【问题标题】:Using Pickle to serialise large objects - what causes 'Memory error'使用 Pickle 序列化大型对象 - 导致“内存错误”的原因
【发布时间】:2021-10-22 18:18:29
【问题描述】:

我正在腌制一个非常大的(就属性和原始大小而言)类。我一直在使用pickle.dump选择pickle没有问题,直到我达到4GB以下,现在我一直得到“内存错误”。我也尝试过使用 json.dump (我得到“不是 JSON 可序列化”错误)。我也尝试过 Hickle,但使用 Hickle 时遇到的错误与使用 Pickle 时相同。

我不能在这里发布所有代码(它很长),但本质上它是一个包含另一个类的值字典的类 - 像这样:

class one:
  def __init__(self):
    self.somedict = {}

  def addItem(self,name,item)
    self.somedict[name] = item

class two:
  def __init__(self):
   self.values = [0]*100

其中 name 是一个字符串,item 是第二类对象的一个​​实例。

其中包含更多代码,但这是保存绝大多数内容的地方。是否有可靠且理想的快速 解决方案将此对象保存到文件中,然后能够在以后重新加载它。我每隔几千次迭代就保存一次(作为备份以防万一出现问题,所以我需要它相当快)。

谢谢!

编辑#1:

我只是认为在我的系统中包含一些详细信息可能会很有用。我有 64Gb 的内存 - 所以我不认为腌制 3-4GB 的文件会导致这种类型的问题(尽管我可能错了!)。

【问题讨论】:

    标签: json python-3.x pickle


    【解决方案1】:

    您可能首先检查了这个,但以防万一:您确定您的 Python 安装是 64 位吗? 3-4GB 立即让我想起了 32 位应用程序的内存限制。

    我发现this resource 对于分析和解决一些更常见的 Python 内存相关问题非常有用。

    【讨论】:

    • 感谢您的回答。我最近没有检查过这个(这 is 是一个新环境),但不幸的是我已经在使用 64 位。我注意到酸洗时内存使用量猛增,但我不知道为什么?
    • Pickling 确实占用大量内存,主要是因为为了序列化数据,它必须在内存中创建对象的副本,从而导致可能导致错误的内存峰值。
    • 我恐怕帮不上什么忙。如果您还没有这样做,您可以尝试使用协议版本 5(我认为从 Python 3.8 开始可用并且处理大型对象比版本 4 好得多)pickle.dump(obj, fp, protocol=5)。您也可以查看joblib 作为替代方案。祝你好运! ;)
    猜你喜欢
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    相关资源
    最近更新 更多