Django / Python / PIL / sorl-генерация миниатюр в объемной памяти ошибка


Я пытаюсь массово генерировать 4 ногтя для каждого из примерно 40k изображений с помощью sorl-thumbnail для моего приложения django. Я перебираю все объекты django с помощью ImageWithThumbnailsFieldFile, а затем вызываю его функцию generate_thumbnails ().

Это работает нормально, за исключением того, что после нескольких сотен итераций у меня заканчивается память, и мой цикл завершается с "ошибкой памяти". Поскольку sorl-thumbnail использует PIL для генерации больших пальцев, похоже, что PIL не возвращает всю память, которую он используется при создании большого пальца.

Кто-нибудь знает, как избежать этой проблемы, например, заставив PIL вернуть память, которая ему больше не нужна?

Мой код выглядит так:

all = Picture.objects.all()
for i in all:
    i.image.generate_thumbnails()

Функция generate-thumbnail запускаетсяЗдесь , строка 129.

Заранее спасибо за любые советы!

Мартин

1 2

1 ответ:

Ваша проблема связана с тем, как Django кэширует результаты набора запросов при циклическом просмотре. Django хранит все объекты в памяти, так что в следующий раз, когда вы повторите тот же набор запросов, вам не придется снова обращаться к базе данных, чтобы получить все данные.

Что вам нужно сделать, так это использовать метод iterator(). Итак:

all = Picture.objects.all().iterator()
for i in all:
    i.image.generate_thumbnails()