Проблема с загрузкой большого количества файлов в Django

У меня проблемы с загрузкой большого количества файлов в Django. Контекст следующий: у меня есть электронная таблица с одним или несколькими столбцами, являющимися именами файлов изображений; эти изображения загружаются через форму с типом ввода = файл и параметром Multiple.

При малом количестве строк - скажем 70, все идет нормально. Но с большим количеством строк и, следовательно, с большим количеством изображений возникает IOError в случайных позициях.

Я проверил несколько вопросов о загрузке файлов/изображений в Django, но не смог найти ни одного, связанного с моей проблемой.

Я использую модель продукта LFS (www.getlfs.com). Мы разрабатываем систему, основанную на LFS, и для облегчения создания десятков продуктов в пакетном режиме мы написали несколько представлений и шаблонов для получения основных свойств продукта через электронную таблицу. Каждая строка — это продукт, а столбцы — желаемые свойства.

LFS использует пользовательский класс ImageWithThumbsField(ImageField) для хранения изображения продукта, и при сохранении экземпляра продукта (полученного из электронной таблицы) создаются все эскизы. Это задача, требующая много времени (процессора), и мое первоначальное предположение состоит в том, что по какой-то причине временный файл удаляется до того, как произошла вся обработка.

Есть ли способ сохранить эти загруженные файлы на большее время? Какой-нибудь другой подход предлагался для обработки сотен загруженных файлов? Любые намеки на то, что может происходить?

Надеюсь, вы понимаете мой вопрос. Я могу опубликовать код, если нужно.

Ссылки на соответствующие части кода LFS:

  • где генерируются эскизы:

https://github.com/diefenbach/django-lfs/blob/master/lfs/core/fields/thumbs.py

  • модель продукта

https://github.com/diefenbach/django-lfs/blob/master/lfs/catalog/models.py

Заранее спасибо!


person momenezes    schedule 04.03.2012    source источник
comment
Не могли бы вы опубликовать трассировку ошибки, которую вы получаете? И как вы запускаете свое приложение? Через веб-сервер или сервер разработки django также выдает ошибку?   -  person ilvar    schedule 04.03.2012
comment
В течение следующих четырех дней часть трассировки будет находиться здесь dpaste.com/711195.   -  person momenezes    schedule 04.03.2012


Ответы (1)


Похоже, у вас заканчивается память. Когда django обрабатывает загрузки, пока форма не будет проверена, все файлы:

  • хранится в памяти внутри процесса/воркера python/wsgi. (Обычный режим работы для сервера запуска)

    В этом случае вы загружаете достаточно фотографий, чтобы заполнить память процесса, и места на ней не хватает. Это будет недетерминировано в отношении того, где происходит IOError, как вы можете себе представить (зависит от GC).

  • Временно хранится в /tmp/ (обычная установка apache)

    В этом случае ramfs веб-сервера заполнен образами, которые еще не были записаны на диск. В этом случае он должен IOError примерно в том же месте.

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

person Thomas    schedule 04.03.2012
comment
+0,5 за довольно жирный шрифт; +0,5 за то, что я пьян. Тоже кажется грамотным ответом, но я могу поставить только 1 балл. - person dokkaebi; 04.03.2012
comment
@Thomas: Кажется, ваш ответ очень близок или действительно является правдой. Когда PIL пытается прочитать файл, это файл размером 0 КБ, вероятно, из-за некоторых причин, которые вы написали. Как вы думаете, может ли помочь изменение временного хранилища на диск? Спасибо за Ваш ответ. - person momenezes; 04.03.2012
comment
@momenezes неужели нужно загружать все картинки в 1 запрос? Я не знаю, как сделать загрузку на диск в django. - person Thomas; 05.03.2012
comment
@Thomas Мы думаем о реорганизации загрузки изображений, чтобы она выполнялась за один шаг до обработки электронной таблицы. Пользователь должен загрузить все изображения в папку (например, партиями по 40 изображений) на сервере, а затем загрузить электронную таблицу. В любом случае, еще раз спасибо за ваши комментарии и время. С наилучшими пожеланиями - person momenezes; 06.03.2012