Вопрос

Я пытаюсь массово создать 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()
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top