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()))

如果upload是 Django 为您生成的东西,打开并准备好,您仍然可以使用contextlib.closing装饰器自动关闭它:

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

要回答您的其余问题:您的泄漏很可能在其他地方。

于 2012-08-06T18:13:04.577 回答