如何使用python cpickle修复“ RuntimeError:字典在迭代过程中更改大小”?

时间:2019-08-01 15:48:54

标签: python pickle memory-address

我正在尝试修复由他人使用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)

如果保存成功并且程序继续运行,我希望获得要保存的self内容和“游戏已保存”消息。

实际输出为“ ”,然后是cpickle运行所在的文件和行的路径,然后是“ cPickle出现一些奇怪的错误-此处显示:”然后是“ RuntimeError:字典在迭代过程中更改了大小”,最后它崩溃了。

编辑: 添加以下代码以拍摄self快照后的新实际输出。现在,新代码中出现错误。如果在创建快照时没有崩溃,则将立即对selfCopy1进行腌制。

selfCopy1 = copy.deepcopy(dict(self))
print selfCopy1 
try: cPickle.dump(selfCopy1,file)

错误消息:

TypeError: iteration over non-sequence

0 个答案:

没有答案