泡菜错误断言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
不变量……但是我确实做了一些变通方法,所以各种对象都添加到pickle
的memo
时你导入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.parent
、dill.detect.children
、dill.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中的主要内容,如果未能解决你的问题,请参考以下文章
Python 酸洗错误:TypeError:对象泡菜未返回列表。 numpy的问题?
加载泡菜 NotFittedError:CountVectorizer - 未安装词汇