1

Django で大量のファイルをアップロードするときに問題が発生します。コンテキストは次のとおりです。1 つ以上の列が画像ファイル名であるスプレッドシートがあります。これらの画像は、input type=file およびオプション multiple を使用してフォームからアップロードされています。

数行 - たとえば 70 行で、すべてがうまくいきます。しかし、より多くの行、したがってより多くの画像があると、ランダムな位置で IOError が発生します。

Django でのファイル/画像のアップロードに関するいくつかの質問を確認しましたが、私の問題に関連するものは見つかりませんでした。

私が使用しているモデルは、LFS (www.getlfs.com) の製品モデルです。私たちは LFS に基づくシステムを開発しており、数十の製品をバッチで簡単に作成できるようにするために、スプレッドシートを介して主要な製品プロパティを受け取るビューとテンプレートを作成しました。各行は製品であり、列は目的のプロパティです。

LFS はカスタム クラス ImageWithThumbsField(ImageField) を使用して製品の画像を保存し、製品インスタンス (スプレッドシートから取得) を保存すると、すべてのサムネイルが生成されます。これは時間 (CPU) を消費するタスクであり、私の最初の推測では、何らかの理由で、すべての処理が行われる前に一時ファイルが削除されたということです。

これらのアップロードされたファイルをより長く保持する方法はありますか? 何百ものアップロードされたファイルを処理できるようにするために提案された他のアプローチはありますか? 何が起こっているのかについてのヒントはありますか?

私の質問を理解していただければ幸いです。必要に応じてコードを投稿できます。

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

前もって感謝します!

4

1 に答える 1

1

メモリが不足しているようです。djangoがアップロードを処理するとき、フォームが検証されるまで、すべてのファイルは次のいずれかです。

  • python/wsgi プロセス/ワーカー内のメモリに保持されます。(runserver の op の通常モード)

    この場合、プロセス メモリをいっぱいにするのに十分な量の写真をアップロードし、スペースを使い果たしています。これは、想像できるように IOError がどこで発生するかについて非決定論的です (GC 依存)。

  • /tmp/ に一時保存(通常の apache の設定)

    この場合、Web サーバーの ramfs は、まだディスクに書き込まれていないイメージでいっぱいです。この場合、同じ場所で IOError が発生するはずです。

どちらの場合も、この方法で画像を一括アップロードするべきではありません。Apache/Django はそのために設計されていません。リクエスト/レスポンスごとに 1 つの商品/画像をアップロードしてみてください。そうすれば、すべての問題が解消されます。

于 2012-03-04T03:08:44.737 に答える