Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:上载的文件未被垃圾收集,导致内存问题_Python_Django_Memory_File Upload_Heroku - Fatal编程技术网

Python Django:上载的文件未被垃圾收集,导致内存问题

Python Django:上载的文件未被垃圾收集,导致内存问题,python,django,memory,file-upload,heroku,Python,Django,Memory,File Upload,Heroku,我有一个Django视图来处理上传的文件,当它被反复调用时,我们总是会遇到内存过多的错误。(我们在Heroku上,因此每个web dyno可获得512mb内存) 内存过多错误表明,每次调用都会按文件大小增加内存使用量,并且内存使用量永远不会下降。我认为服务器会将图像读入内存,然后将其保存到Django模型中,但在完成后不会释放内存 我认为在函数返回后必须有一个对持久化的映像的引用,以防止映像被垃圾收集。但我想不出那会是什么 下面是代码的简化版本,我对其进行了测试,以确保其存在相同的问题: def

我有一个Django视图来处理上传的文件,当它被反复调用时,我们总是会遇到内存过多的错误。(我们在Heroku上,因此每个web dyno可获得512mb内存)

内存过多错误表明,每次调用都会按文件大小增加内存使用量,并且内存使用量永远不会下降。我认为服务器会将图像读入内存,然后将其保存到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
这是新的商业形象模型

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)

根据Django文档,它附带了2个文件上载处理程序。内存和临时文件处理程序(

如果您将设置配置为仅包括“django.core.files.uploadhandler.TemporaryFileUploadHandler”,则永远不会将文件保存到内存中,并且从技术上讲永远不会导致您目前面临的内存问题


另一个选项是将设置为一个小的量,这将导致上传直接进入磁盘。

这是什么
image\u meta\u任务。延迟
?这是一个异步芹菜任务,在单独的服务器上启动(不是我的web服务器),将图像处理为标准大小并保存。如果这是一个简化版本,则意味着如果您删除
image\u meta\u任务。延迟
,则不会出现内存问题?此外,您将文件存储在何处?能否发布settings.py storege settings和
NewBusinessImage
?@danihp添加了您请求的信息。敬请原谅est,我没有在没有image_meta_task.delay的情况下测试此函数,因为该任务是保持数据库正常运行所必需的。我认为,因为它在不同的服务器上执行,所以即使对于简化版本,也可以安全地离开。您认为这可能是问题的一部分吗?您是否尝试在newBI.save()之后将newBI设置为None?很抱歉,这只能释放一半内存,因为请求还包含图像字节。。。