文件上传器(Heroku上的Django)的Ajax实现中的内存泄漏

文件上传器(Heroku上的Django)的Ajax实现中的内存泄漏,ajax,django,file-upload,heroku,django-imagekit,Ajax,Django,File Upload,Heroku,Django Imagekit,我已经为Django创建了一个ajax文件上传器,但是上传的每个文件都占用了一大块内存(30-80MB),而且似乎没有放弃 我们在Heroku上,它为每个dyno分配512mb内存,所以我很快就开始克服内存错误 以下是处理请求的Django视图代码: if request.is_ajax(): # the file is stored raw in the request upload = request is_raw = True

我已经为Django创建了一个ajax文件上传器,但是上传的每个文件都占用了一大块内存(30-80MB),而且似乎没有放弃

我们在Heroku上,它为每个dyno分配512mb内存,所以我很快就开始克服内存错误

以下是处理请求的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)
下面是保存上传代码:

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
此代码改编自(感谢Alex Kuhl和Thunder Rabbit)

我认为内存问题可能与django imagekit有关,或者我可能没有正确关闭文件,但我不确定。我真的很感激任何帮助

谢谢


Clay

Django上载处理程序通常不用于处理和传输文件,它们用于让文件准备好传递到request.files数组中的视图(通过保存到/tmp或保存到内存)


如果您希望以简单、快速、低内存的方式获得进度反馈,请尝试使用
[nginx upload module][1]
(并上载进度)。它将上传复制到磁盘上的指定位置,并将请求传递到视图上,并在POST vars中显示文件路径、大小和mime类型。比使用django更有效。

我认为这与django imagekit没有直接关系。DjangoAjax上传程序中也存在漏洞,它基于相同的js代码。请看:。@DirkEschler——真的很感谢你的链接,Dirk。django imagekit确实有记录在案的内存问题(请参阅:),但即使在离开它迁移之后,我注意到我仍然存在问题,尽管问题不那么严重,您的链接解释了这些问题。再次感谢。