Массовое создание миниатюр Django/Python/PIL/sorl – ошибка памяти
-
05-07-2019 - |
Вопрос
Я пытаюсь массово создать 4 миниатюры для каждого из примерно 40 тыс. изображений с помощью Сорл-миниатюра для моего приложения Django.Я перебираю все объекты django с помощью ImageWithThumbnailsFieldFile, а затем вызываю его функциюgenerate_thumbnails().
Это работает нормально, за исключением того, что после нескольких сотен итераций у меня заканчивается память, и мой цикл выходит из строя с «ошибкой памяти».Поскольку sorl-thumbnail использует PIL для создания миниатюр, похоже, что PIL не возвращает всю память, использованную при создании миниатюр.
Кто-нибудь, как избежать этой проблемы, например.заставив PIL вернуть память, которая ему больше не нужна?
мой код выглядит просто так:
all = Picture.objects.all()
for i in all:
i.image.generate_thumbnails()
Запускается функция генерации миниатюр здесь, строка 129.
Заранее благодарю за любой совет!
Мартин
Решение
Ваша проблема связана с тем, как Django кэширует результаты набора запросов по мере их обработки.Django хранит все объекты в памяти, поэтому в следующий раз, когда вы будете выполнять итерацию по тому же набору запросов, вам не придется снова обращаться к базе данных, чтобы получить все данные.
Что вам нужно сделать, это использовать итератор() метод.Так:
all = Picture.objects.all().iterator()
for i in all:
i.image.generate_thumbnails()