我目前正在用Python编写一个简单的棋盘游戏,我刚刚意识到垃圾回收并不会在重新加载图像时从内存中清除丢弃的位图数据。它仅在启动或加载游戏或分辨率改变时才会发生,但是它会使消耗的内存倍增,因此我无法解决此问题。
重新加载图像时,所有引用都将传输到新图像数据,因为它绑定到与原始图像数据绑定到的变量相同的变量。我试图通过使用强制垃圾收集,collect()但没有帮助。
我写了一个小样本来演示我的问题。
from tkinter import Button, DISABLED, Frame, Label, NORMAL, Tk
from PIL.Image import open
from PIL.ImageTk import PhotoImage
class App(Tk):
def __init__(self):
Tk.__init__(self)
self.text = Label(self, text = "Please check the memory usage. Then push button #1.")
self.text.pack()
self.btn = Button(text = "#1", command = lambda : self.buttonPushed(1))
self.btn.pack()
def buttonPushed(self, n):
"Cycle to open the Tab module n times."
self.btn.configure(state = DISABLED) # disable to prevent paralell cycles
if n == 100:
self.text.configure(text = "Overwriting the bitmap with itself 100 times...\n\nCheck the memory usage!\n\nUI may seem to hang but it will finish soon.")
self.update_idletasks()
for i in range(n): # creates the Tab frame whith the img, destroys it, then recreates them to overwrite the previous Frame and prevous img
b = Tab(self)
b.destroy()
if n == 100:
print(i+1,"percent of processing finished.")
if n == 1:
self.text.configure(text = "Please check the memory usage now.\nMost of the difference is caused by the bitmap opened.\nNow push button #100.")
self.btn.configure(text = "#100", command = lambda : self.buttonPushed(100))
self.btn.configure(state = NORMAL) # starting cycles is enabled again
要运行上面的代码,您将需要一个PNG图像文件。我的map.png的尺寸是1062×1062。作为PNG,它是1.51 MB,而作为位图数据,它是3-3.5 MB。使用大图像可以轻松查看内存泄漏。
运行我的代码时的预期结果:python的进程逐周期消耗内存。当它消耗约500 MB的内存时,它会崩溃但又开始耗尽内存。
请给我一些建议,以解决这个问题。感谢您的帮助。谢谢你。提前。
海绵宝宝撒
相关分类