【问题标题】:python pickler - recursion depth exceededpython pickler - 超出递归深度
【发布时间】: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 给定虚拟数据的输出,您会看到它首先进入深度。由于我猜该格式不允许前向引用,恐怕您将无法修改或创建它的子类以解决您的问题...

标签: python recursion pickle


【解决方案1】:

所以,正如@ExP 所说,pickler 会进行深度优先酸洗,这会导致递归超出异常。无论如何,我在这里找到了解决这个问题的方法bugs.python.org。这意味着对于 python 3.1,pickler 甚至可以处理递归数据,例如图形。

还有一些不太优雅的解决方案,它需要更多时间来腌制一些递归数据,但它很简单(只需几行代码)。链接here

看起来,是时候开始慢慢向 python3 移动了。希望有人觉得这个答案有用。

【讨论】:

  • 如果您最终使用来自bugs.python.org/issue2480 的修复程序,请确保使用 python 文件 nonrecursivepickler-fixed.py 而不是另一个。另外值得注意的是,这种泡菜解决方案的压缩比香草泡菜少得多,所以你的泡菜文件会更大。感谢您的解决方案!
  • 虽然这个issue2480版本可以工作,但是对于大型结构来说效率很低,因为它使用了list.pop(0)和list.extend。在我的大型数据结构上,腌制需要 10 个小时。使用双端队列的重写将时间缩短到 4 分钟。
猜你喜欢
  • 2011-12-31
  • 1970-01-01
  • 2020-07-13
  • 2021-02-07
  • 2017-03-18
  • 2015-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多