【发布时间】:2013-04-06 05:04:34
【问题描述】:
我正在尝试腌制我的元胞自动机类的实例,但出现此错误:
RuntimeError: maximum recursion depth exceeded while calling a Python object
我的元胞自动机由单元格列表(和一堆其他东西)组成,其中每个单元格都有指向它的邻居的指针。在这个特定的 CA 中,有 256 个单元。现在,我知道pickler 应该能够识别已经腌制的对象。
来自文档:
*pickle 模块会跟踪它已经序列化的对象,以便以后对同一对象的引用不会再次被序列化。
所以我真的不知道,为什么我超过了最大递归深度。
我认为pickler 可能会进行深度优先酸洗,以便它首先跟随指针,超过递归堆栈,然后引发异常。我知道我可以使用 sys.setrecursionlimit() 扩展最大递归深度,但我不认为这是一个好的或可扩展的解决方案。
第一个问题:pickler是否深度优先酸洗?
第二个问题:知道如何防止这个异常吗?
【问题讨论】:
-
您可以发布任何代码吗?
-
是的,
pickle深度优先。不幸的是,我认为周围没有。尝试cPickle,但它可能会给出同样的错误。 -
@AswinMurugesh 实际上我有太多代码要发布。不过如果你有兴趣,这里有一些关键文件:neighbourhoodcellpickling Exp:cPickle 是一样的,我之前试过。我害怕这个答案
-
@ExP 你有关于泡菜如何在内部工作的更具体的信息/资源吗?也许创建pickler的子类?总有办法的。我只需要仔细看看:)
-
@sjudǝʊ 如果您查看
pickle给定虚拟数据的输出,您会看到它首先进入深度。由于我猜该格式不允许前向引用,恐怕您将无法修改或创建它的子类以解决您的问题...