gpt4 book ai didi

python - 使用 Pickle/cPickle 达到最大递归深度

转载 作者:IT老高 更新时间:2023-10-28 20:30:01 24 4
gpt4 key购买 nike

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

问题:我希望能够将我的尝试序列化到磁盘,这样我就可以将它加载到内存中,而无需从头开始重建(大约 22 分钟)。我已经尝试了 pickle.dump()cPickle.dump(),包括文本和二进制协议(protocol)。每次,我都会得到如下所示的堆栈跟踪:

  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 包含一个 bool 字段、一个字符串字段和一个从标签到状态的字典映射。

我对 pickle 的内部工作原理不是很熟悉 - 对于某些 n,我的最大递归深度是否需要大于/等于树深度的 n 倍?或者这可能是由我不知道的其他原因引起的?

更新:将递归深度设置为 3000 并没有帮助,因此这条途径看起来并不乐观。

更新 2: 你们是对的;由于默认递归限制,我假设 pickle 将使用较小的嵌套深度是短视的。 10,000 人成功了。

最佳答案

来自 the docs :

Trying to pickle a highly recursive data structure may exceed the maximum recursion depth, a RuntimeError will be raised in this case. You can carefully raise this limit with sys.setrecursionlimit().

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

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

除此之外,如果可能的话,您可以尝试将树实现更改为“更少递归”,或者编写具有内置数据持久性的附加实现(使用 pickles 和 shelves在您的实现中)。希望有帮助

关于python - 使用 Pickle/cPickle 达到最大递归深度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2134706/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com