4

Djangoを使用してajaxアップロードファイルを読み取り、モデルに保存しています。アップロードリクエストには、アップロードされた生の画像データが含まれています。

def my_view(request):
    upload = request
    model_instance.image_field.save(uniquename, ContentFile(upload.read()))

重要な場合は、アップロードされたファイルのストレージバックエンドとしてAmazonS3を使用しています。

このコードを含む関数のどこかに、メモリリークがあります。

upload.close()これを行った後、リソース/メモリを解放するために呼び出す必要がありますか?
それとも、私のメモリの問題は、この関数の他の場所にある他の問題に起因していますか?

4

1 に答える 1

16

Pythonガベージコレクターは、参照されなくなったファイルを閉じます。

変数が関数内のローカル変数である場合upload、関数が戻るときにクリアされます。したがって、参照されるファイルuploadは、通常のガベージコレクションサイクル中に自動的に閉じられます。

そうは言っても、ファイルを閉じる方がおそらく良いでしょう。ファイルをコンテキストマネージャーとして使用でき、コンテキストが終了すると自動的に閉じられます。

with open('yourfilepath.ext') as upload:
    model_instance.image_field.save(uniquename, ContentFile(upload.read()))

Djangoが作成するもので、開いていて準備ができている場合uploadでも、contextlib.closingデコレータを使用して自動的に閉じることができます。

import contextlib
with contextlib.closing(upload):
     model_instance.image_field.save(uniquename, ContentFile(upload.read()))

あなたの質問の残りに答えるために:あなたのリークは他の場所である可能性が最も高いです。

于 2012-08-06T18:13:04.577 に答える