Django:上传的文件没有被垃圾回收,导致内存问题

2024-09-30 10:27:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个处理上传文件的Django视图,当它被反复调用时,我们总是会遇到内存溢出错误。(我们在Heroku上,所以每个网络动态都有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,
        })

我真的很感激你的帮助。谢谢!在

粘土

以下是评论中要求的附加信息:

我们将文件存储在Amazon 3上:

^{pr2}$

这是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)

Tags: theto内存imageidtrueismodels
1条回答
网友
1楼 · 发布于 2024-09-30 10:27:42

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

如果将设置FILE_UPLOAD_HANDLERS设置配置为仅包括“django.core.files.uploadhandler.TemporaryFileUploadHandler“它不应该将文件保存到内存中,而且从技术上讲,它不会导致您当前面临的内存问题。在

另一个选择是将FILE_UPLOAD_MAX_MEMORY_SIZE设置为一个较小的值,这将导致上载直接转到磁盘。在

相关问题 更多 >

    热门问题