2012-08-09 3 views
5

アップロードされたファイルを処理するDjangoビューがあり、繰り返し呼び出されるとメモリオーバーエラーが発生します。 (私たちはHerokuにいるので、Web dynoあたり512MBのメモリが得られます)。Django:アップロードされたファイルがガベージコレクションされておらず、メモリの問題が発生しました

メモリオーバーエラーは、呼び出しごとにファイルのサイズによってメモリ使用量が増加し、メモリ使用率が低下しないことを示しています。サーバーはイメージをメモリに読み込んでDjangoモデルに保存すると思いますが、完了したらメモリを解放することはありません。

私は、イメージがガベージコレクションされないようにするために、関数が返った後も保持されているイメージへの参照が必要であると思います。しかし、私はそれが何であるか考えることはできません。

ここで私はそれが同じ問題を抱えていることを確認するためにテストされたコードの簡易版です。

def simplified_add_image(request, biz_id): 
    if request.is_ajax(): 
     # the file is stored raw in the request 
     newBI = NewBusinessImage(business_id=biz_id, name=request.GET.get("name"), primary_image=True) 
     newBI.id = uuid.uuid4() 
     newBI.save() 
     uniquename = biz_id + ".." + get_a_uuid() + ".jpg" 

     newBI.original_image.save(uniquename, ContentFile(request.read())) 

     # this starts a series of tasks to process the image into various sizes. 
     # don't think it's the problem because it runs on a separate server, and the 
     # web server is the one that goes over memory 
     tasks.image_meta_task.delay(uniquename, newBI.id) 

     return StockJSONResponse(request, { 
      "success" : True, 
     }) 

は、私は本当に任意の助けをいただければと思います。どうもありがとう!

クレイ

次はコメントで要求された追加情報です:

我々はAmazonS3に私たちのファイルを格納している:

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage' 
STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage' 
STATIC_URL = 'https://s3.amazonaws.com/%s/' % AWS_STORAGE_BUCKET_NAME 
from S3 import CallingFormat 
AWS_CALLING_FORMAT = CallingFormat.SUBDOMAIN 

そして、ここではNewBusinessImageモデルは

です
class NewBusinessImage(models.Model): 
    id = UUIDField(auto=True,primary_key=True,version=4, default=uuid.uuid4()) 
    business = models.ForeignKey('Business') 
    name = models.CharField(max_length=100) 
    original_image = models.ImageField(upload_to='photos/originals/') 
    thumbnail = models.ImageField(upload_to='photos/thumbnails/') 
    display_image = models.ImageField(upload_to='photos/displays/') 
    enlarged_image = models.ImageField(upload_to='photos/enlarged/') 
    num_views = models.PositiveIntegerField(editable=False, default=0) 
    primary_image = models.BooleanField(default=False) 
+0

この 'image_meta_task.delay'は何ですか? –

+0

これは、非同期セロリの仕事ですこれは、別のサーバー(私のWebサーバーではない)で起動し、イメージを標準サイズに処理しますそれらを保存してください。 –

+0

これが単純化されたバージョンであれば、 'image_meta_task.delay'を削除してもメモリに問題はありません。また、ファイルをどこに保存しますか? settings.py storege設定と 'NewBusinessImage'を投稿できますか? – danihp

答えて

0

Djangoのドキュメントによると、2つのファイルアップロードハンドラが付属しています。メモリと一時ファイルハンドラ(Link to docs)

あなただけの「django.core.files.uploadhandler.TemporaryFileUploadHandler」を含めるように設定FILE_UPLOAD_HANDLERS設定を行う場合は、「メモリにファイルを保存したことがないし、技術的にメモリの問題にあなたを起こすことはありません現時点で直面し再。

別のオプションは、アップロードがディスクに直接行くことになります少量にFILE_UPLOAD_MAX_MEMORY_SIZEを設定することです。

関連する問題