我试图pickle我的细胞自动机类的实例,但是我得到了这个错误:
RuntimeError: maximum recursion depth exceeded while calling a Python object
我的元胞自动机由细胞列表(以及其他一些东西)组成,每个细胞都有指向其邻居的指针。在这个特定的自动机中,有256个细胞。现在,我知道pickler应该能够识别已经pickled的对象。
根据文档:
* pickle模块跟踪它已经序列化的对象,以便稍后对相同对象的引用不会再次序列化。
所以我不知道为什么会超出最大递归深度。
我认为可能是pickler进行了深度优先的pickling,因此它首先遵循指针,超出递归堆栈然后引发异常。我知道我可以使用
sys.setrecursionlimit()
来扩展最大递归深度,但我不认为这是一个好的、可扩展的解决方案。第一个问题:pickler是否进行深度优先的pickling?
第二个问题:如何防止此异常?
pickle
是深度优先的。不幸的是,我认为没有绕过这个问题的方法。尝试使用cPickle
,但它可能会产生相同的错误。 - Elmar Peisepickle
在给定虚拟数据的输出结果,您会发现它采用深度优先的方式。由于我猜测该格式不允许前向引用,我很抱歉您将无法修改或创建其子类以解决您的问题... - Elmar Peise