Массовая генерация Django / Python / PIL / sorl-thumbnail - ошибка памяти - PullRequest
2 голосов
/ 26 ноября 2009

Я пытаюсь массово сгенерировать 4 thumnails для каждого из около 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.

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

Martin

1 Ответ

4 голосов
/ 26 ноября 2009

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

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

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