Проблемы с загрузкой большого количества файлов в Django - PullRequest
1 голос
/ 04 марта 2012

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

С несколькими строками - скажем, 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

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

1 Ответ

1 голос
/ 04 марта 2012

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

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

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

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

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

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

...