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 также, похоже, не имеет никакого эффекта.

0 ответов

Другие вопросы по тегам