python教程—使用Pickle / cPickle达到最大递归深度-Python实用宝典

python教程—使用Pickle / cPickle达到最大递归深度

背景:我正在构建一个trie来表示一个字典,使用一个最小的构造算法。输入列表是4.3M utf-8字符串,按字典顺序排序。得到的图是非循环的,最大深度为638个节点。脚本的第一行通过sys.setrecursionlimit()将递归限制设置为1100。

背景:我正在构建一个trie来表示一个字典,使用一个最小的构造算法。输入列表是4.3M utf-8字符串,按字典顺序排序。得到的图是非循环的,最大深度为638个节点。脚本的第一行通过sys.setrecursionlimit()将递归限制设置为1100。

问题:我希望能够将我的trie序列化到磁盘,这样我就可以将它加载到内存中,而不需要重新构建(大约需要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包含对start状态的引用,并定义了一些方法。dfa_state包含一个布尔字段、一个字符串字段和一个从标签映射到状态的字典。

我对pickle的内部工作不是很熟悉——对于某个n,我的最大递归深度是否需要大于/等于n乘以trie的深度?或者这是我不知道的其他原因?

Update:将递归深度设置为3000没有帮助,所以这条路看起来不太可能。

Update 2:你们是对的;由于默认递归限制,我想当然地认为pickle将使用较小的嵌套深度,这是短视的。10000人成功了。

回答

文档:

尝试pickle高度递归的数据结构可能会超过最大递归深度,在这种情况下会引发RuntimeError。可以使用sys.setrecursionlimit()小心地提高这个限制。

尽管您的trie实现可能很简单,但是它使用递归,并且在转换为持久数据结构时可能会导致问题。

我的建议是继续提高递归限制,看看您正在处理的数据和正在使用的trie实现是否有上限。

除此之后,你可以试着改变你的树实现“递归”,如果可能,或者写< /强> <强>额外实现数据持久性的内置(用泡菜和< a href = " http://docs.python.org/library/shelve.html " rel = " noreferrer " >货架< / >在你实现)。希望这有助于

​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

本文由 Python实用宝典 作者:Python实用宝典 发表,其版权均为 Python实用宝典 所有,文章内容系作者个人观点,不代表 Python实用宝典 对观点赞同或支持。如需转载,请注明文章来源。
0

发表评论