3

Django用のajaxファイルアップローダーを作成しましたが、アップロードされた各ファイルは大きなメモリ(30〜80 mb)を消費し、それを手放さないようです。

dynoごとに512MBのメモリを割り当てるHerokuを使用しているため、すぐにメモリ超過エラーが発生し始めます。

リクエストを処理するためのDjangoビューコードは次のとおりです。

if request.is_ajax():
        # the file is stored raw in the request
        upload = request
        is_raw = True
        try:
          filename = request.GET[ 'add_image' ]
        except KeyError:
          return HttpResponseBadRequest( "AJAX request not valid" )
        (fileBaseName, fileExtension)=os.path.splitext(filename)

        uniquename = biz_id + "__" + get_a_uuid() + fileExtension
        saved = save_upload(upload, uniquename, biz)

そして、ここにsave_uploadコードがあります:

try:
    #BusinessImage is my Django model.  It uses django-imagekit to processs
    #the raw uploaded image into three sizes (plus the original)
    bi = BusinessImage(name=uploaded.GET.get("name"), business=biz)
    if not BusinessImage.objects.filter(business=biz).exists():
        bi.primary_image = True
    bi.original_image.save(filename,ContentFile(uploaded.read()))
except IOError:
    # could not open the file most likely
    return False
finally:
    uploaded.close()
return True

このコードは、この投稿を基にしています(AlexKuhlとThunderRabbitに感謝します)。

メモリの問題はdjango-imagekitに関係しているのではないか、ファイルを適切に閉じていないのではないかと思いますが、よくわかりません。助けていただければ幸いです。

ありがとう!

粘土

4

1 に答える 1

1

Djangoアップロードハンドラーは通常、ファイルを処理および変換するためのものではなく、request.FILES配列のビューに渡す準備をするためのものです(/ tmpへの保存またはメモリへの保存を介して)。

[nginx upload module][1]進捗状況のフィードバックを取得するための簡単、迅速、低メモリの方法が必要な場合は、(および進捗状況のアップロード)を使用してみてください。アップロードをディスク上の指定された場所にコピーし、POST変数のファイルパス、サイズ、およびmimeタイプを使用してリクエストをビューに渡します。djangoで行うよりもはるかに効率的です。

于 2012-08-27T18:44:00.273 に答える