泡菜错误断言id(obj)不在self.memo中

Posted

技术标签:

【中文标题】泡菜错误断言id(obj)不在self.memo中【英文标题】:pickle error assert id(obj) not in self.memo 【发布时间】:2014-08-11 10:29:30 【问题描述】:

我现在正在使用dill(pickle 的高级版)。我想序列化我的对象,但出现此错误:

/usr/lib/python2.7/pickle.pyc in memoize(self, obj)
    242         if self.fast:
    243             return
--> 244         assert id(obj) not in self.memo
    245         memo_len = len(self.memo)
    246         self.write(self.put(memo_len))

谁能告诉我这个错误的可能性或者我该如何解决这个问题?

【问题讨论】:

你能告诉我们抛出错误的代码吗? 乍一看,dill 违反了pickle 不变量;递归结构不应导致循环引用再次被腌制。 self.memo 跟踪之前已经腌制过的内容。 @enrico.bacis 很抱歉,代码很长而且有多个文件...所以我几乎不会向您展示...但我使用的是 Numpy、Scipy、Theano 框架...跨度> @MartijnPieters 所以我应该尝试搜索导致该问题的循环引用? @MartijnPieters:我是dill 作者。这只是将copy_reg 用于不同对象的一大集合,我没有违反任何pickle 不变量……但是我确实做了一些变通方法,所以各种对象都添加到picklememo 时你导入dill。添加到备忘录中没有重复,除非你做一些奇怪的事情,比如import pickle,然后是copy_reg 一些东西,然后是import dill——在很多情况下这可能还不错。 【参考方案1】:

如果您不发布代码的简化版本,就很难提供帮助。但是,dill 有一些内置的检测方法。看dill.detect

>>> # trace dill's pickling of objects, by printing out step by step trace 
>>> dill.detect.trace(True)

或通过对象检查。

>>> dill.detect.badobjects(yourfailingobject, depth=1)

还有dill.detect.badtypes等等。

或者您可以使用dill.detect.parentdill.detect.childrendill.detect.reference 等来追踪对象之间的关系。

这是一个使用dill(加上objgraph 用于可视化)跟踪循环引用的示例。 https://github.com/uqfoundation/dill/issues/58

还有一大串 dill 不知道如何在 dill._objects 中序列化的内容——至少是 Python 标准库的前 15 个部分,以及其他一些部分。

【讨论】:

现在我尝试了 dill.detect.trace(True)。以及错误指向我从要序列化的类对象中编码 def __init__(self, a, b, c) 的行之前的最后一行 INFO。 @psuedobot:很难从您的上述评论中看出发生了什么

以上是关于泡菜错误断言id(obj)不在self.memo中的主要内容,如果未能解决你的问题,请参考以下文章

StackGAN 泡菜错误

Python 酸洗错误:TypeError:对象泡菜未返回列表。 numpy的问题?

加载泡菜 NotFittedError:CountVectorizer - 未安装词汇

Direct2d CreateBitmapfromWICBitmap 在 ATL 中给出断言错误

Laravel TDD 断言数组具有键“id”失败

在 Fluent 断言中排除未初始化 (null) 的属性