Python中的MemoryError导致空pickle fi

2024-04-25 04:35:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个库类型的签出/签入系统。当用户单击exit时,程序调用一个close_window函数,该函数在窗口被破坏之前将当前字典对象转储到pickle文件中。在

def close_window(self):
    if messagebox.askokcancel("Quit", "You want to close the program now?"):
        patrons.dump_data()

        self.master.destroy()

当程序再次启动时,它调用一个load_data函数来加载pickled文件。不知怎么的,我在退出系统时遇到了MemoryError,其中一个pickled文件被一个空文件覆盖。根据the documentation,我发现当程序创建太多对象并耗尽内存时,MemoryError就会发生。我不知道为什么会发生这种情况,因为我不是在处理大数据。被覆盖的pickle文件只有1kb。在

MemoryError发生时,如何确保我的pickled文件不会被空文件覆盖?这可能导致严重的数据丢失。我是新编程和使用这个项目学习。可能是我做了一些严重的错误导致内存错误,或者我只是需要更多的计算机内存。在任何情况下,用空文件覆盖保存的文件是没有意义的,无论内存是否出错。在

^{pr2}$

此错误在MemoryError while pickling data in python中有部分讨论。不过,这里有一个空文件,甚至没有一个部分文件。我想知道是否有解决这个问题的方法。可能是将pickled数据保存到一个临时文件中。如果在保存期间没有发生内存错误,那么可以使用临时文件覆盖永久文件(但这可能还会触发另一个MemoryError对吗?)。在

我运行win7x86,3gbram,python3.4.1


Tags: 文件数据对象函数内存self程序close
1条回答
网友
1楼 · 发布于 2024-04-25 04:35:55

根据Gerrat的上述评论,我想知道以下是一个很好的解决方法:

patrons.py
def dump_data():
    with open("./pickled_dicts/temp_patrons.pkl", 'wb') as f:
        global patronslist
        pickle.dump(patronslist, f)


main.py
def close_window(self):
    if messagebox.askokcancel("Quit", "You want to close the program now?"):
        try:
            patrons.dump_data()
            os.remove("./pickled_dicts/patrons.pkl")
            os.rename("./pickled_dicts/temp_patrons.pkl", "./pickled_dicts/patrons.pkl")
        except MemoryError:
            messagebox.showerror("Memory Problem", "Your computer experienced memory problem. Your last session was not saved.")     
        self.master.destroy()

实际上,我首先将dictionary对象保存到一个临时文件(temp_patrons.pkl),该文件被重命名为我的永久文件(patrons.pkl),假设没有MemoryError。如果MemoryError,则原始的{}仍然存在。在

相关问题 更多 >