python - 如何使用 python cpickle 修复“RuntimeError:迭代期间字典更改大小”?
问题描述
我正在尝试修复一个由其他人用 python 2.7.16 编写的 8 年历史的视频游戏。主要问题是它在尝试保存时崩溃。每当它试图将数据腌制到保存文件中时,它就会崩溃并创建一个不完整的保存文件。
我最近的第二个错误是达到最大递归限制错误。我通过使用以下方法增加递归限制来修补它。
sys.setrecursionlimit(1500)
我不认为它解决了任何潜在的问题。现在我收到以下错误:
RuntimeError: dictionary changed size during iteration
我试图让程序将进入泡菜的内容打印到控制台中,但我得到的是内存地址而不是数据。
它打印出来,A 和 B 是我不想输入的十六进制内存地址。但如果必须,我可以。
这是发生问题的代码。
sys.setrecursionlimit(2000) #changing the recursion limit to see if it fixes cpickle.
file = open(filename,"w")
print self #Printing what will be pickled into a save to look for errors.
try: cPickle.dump(self,file)
except MemoryError:
print "DEBUGGING: cPickle failed, likely because of memory issue. Switching to regular pickle. Regular pickle is slower but less memory intensive."
import pickle
try: pickle.dump(self,file)
except: print "DEBUGGING: regular pickle also failed. The game was NOT saved"
else: print "game saved"
except:
print "some weird error with cPickle - shown here:"
cPickle.dump(self,file)
如果保存有效并且程序继续,我希望获得将被保存的自我内容和“游戏保存”消息。
实际输出是“”,然后是运行 cpickle 的文件和行的路径,然后是“cPickle 出现一些奇怪的错误 - 此处显示:”,然后是“RuntimeError:迭代期间字典更改大小”,最后它崩溃了。
编辑:添加以下代码以拍摄自我快照后的新实际输出。错误现在出现在新代码中。selfCopy1 是如果它在制作快照时没有崩溃现在将被腌制的东西。
selfCopy1 = copy.deepcopy(dict(self))
print selfCopy1
try: cPickle.dump(selfCopy1,file)
错误信息:
TypeError: iteration over non-sequence
解决方案
推荐阅读
- python-3.x - 按需运行 Flask 以可视化计算数据
- javascript - XMLHttpRequest 响应不希望的响应
- django - 模板中的多对多关系
- python - 无法将此 JSON 数据插入 SQL Server?
- django - 向 Django 中添加参数 include('django.contrib.auth.urls')
- xml - Powershell从xml获取文本节点
- android - android studio的activity_main.xml卡在加载中
- c++ - Visual Studio 2019 16.4.5 中涉及 Microsoft::WRL 的无影响但令人讨厌的错误
- node.js - JSDoc 配置排除输出文件
- javascript - 如何将我的“for”循环变成“for of”循环?