我正在开发一个python程序,它通过requests
获取图像,当时显示五个,每次更新一个给定的间隔。一个单独的线程负责偶尔使用新图像更新队列。
它应该运行在覆盆子pi(带有.5gb ram的原始模型b)上运行raspbian(debian wheezy)。
我在python3中写这个并使用TKinter,Pillow和request。
它在我的Windows开发机器上工作得很好。它在pi上运行良好,但过了一段时间它在更新屏幕上的图像时变慢,最终它被linux杀死。检查/ var / log / syslog显示它被杀死是因为系统内存不足。
在Windows上运行它,我在任务管理器中注意到,每次更新屏幕图像时,内存使用量会增加〜1mb。在调试模式中单步执行代码,我可以看到内存使用量的增加发生在以下函数中:
def resize(self, img, width, height):
img = img.resize((width, height), Image.ANTIALIAS)
tkimg = ImageTk.PhotoImage(img)
return tkimg
似乎img对象悬而未决。 所以我的问题是:当我将调整大小的图像分配给同一个变量时,为什么会出现这种情况?垃圾收集器不应该自动处理吗?
任何帮助表示赞赏!
修改:
在while True
中包含罪魁祸首行,内存使用量不随着每次传递而增加。当使用新的img
作为参数调用函数时,似乎只会增加。
while True:
img = img.resize((width, height), Image.ANTIALIAS)
tkimg = ImageTk.PhotoImage(img)
将已分配给TKinter标签后删除返回的img对象似乎也没有任何效果。