Python: утечка памяти при изменении размеров изображений
Я работаю над программой Python, которая получает изображения через requests
, отображает их пять одновременно, обновляя по одному с заданным интервалом. Отдельный поток отвечает за обновление очереди свежими изображениями время от времени. Предполагается, что он будет работать на Raspberry Pi (оригинальная модель B с.5 ГБ оперативной памяти) под управлением Rasbian (Debian Wheezy).
Я пишу это на python3 и использую TKinter, Pillow и запросы.
Это работает довольно хорошо - на моей машине разработки Windows. Он также отлично работает на pi, но через некоторое время он медленнее обновляет изображения на экране, и в конечном итоге его убивает linux. Проверка /var/log/syslog показывает, что он убит, потому что системе не хватает памяти.
Запустив его в Windows, я заметил в диспетчере задач, что использование памяти увеличивается на 1 Мб каждый раз, когда обновляется изображение на экране. Проходя по коду в режиме отладки, я вижу, что увеличение использования памяти происходит в следующей функции:
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)
Удаление возвращенного объекта img после назначения его метке TKinter также, похоже, не имеет никакого эффекта.