首页 > 解决方案 > 如何使用 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

标签: pythonpicklememory-address

解决方案


推荐阅读