【发布时间】:2011-01-09 05:36:48
【问题描述】:
背景:我正在使用最小构造算法构建一个表示字典的树。输入列表是 4.3M utf-8 字符串,按字典顺序排序。结果图是非循环的,最大深度为 638 个节点。我脚本的第一行通过sys.setrecursionlimit() 将递归限制设置为1100。
问题:我希望能够将我的尝试序列化到磁盘,这样我就可以将它加载到内存中,而无需从头开始重建(大约 22 分钟)。我已经尝试了pickle.dump() 和cPickle.dump(),同时使用了文本和二进制协议。每次,我都会得到如下所示的堆栈跟踪:
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 649, in save_dict
self._batch_setitems(obj.iteritems())
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 663, in _batch_setitems
save(v)
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 725, in save_inst
save(stuff)
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 648, in save_dict
self.memoize(obj)
RuntimeError: maximum recursion depth exceeded
我的数据结构比较简单:trie 包含对开始状态的引用,并定义了一些方法。 dfa_state 包含一个布尔字段、一个字符串字段和一个从标签到状态的字典映射。
我对@987654327@ 的内部工作原理不是很熟悉——我的最大递归深度是否需要大于/等于某些 n 的特里树深度的 n 倍?或者这可能是由我不知道的其他原因引起的?
更新:将递归深度设置为 3000 并没有帮助,因此这条途径看起来并不乐观。
更新 2: 你们是对的;由于默认递归限制,我假设 pickle 将使用较小的嵌套深度是短视的。 10,000 人成功了。
【问题讨论】:
标签: python recursion tree pickle depth