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 ответ:
Ваша проблема связана с тем, как Django кэширует результаты набора запросов при циклическом просмотре. Django хранит все объекты в памяти, так что в следующий раз, когда вы повторите тот же набор запросов, вам не придется снова обращаться к базе данных, чтобы получить все данные.
Что вам нужно сделать, так это использовать метод iterator(). Итак:
all = Picture.objects.all().iterator() for i in all: i.image.generate_thumbnails()