大文件上传到 Django Rest Framework

Ben*_*min 4 django django-rest-framework

我尝试在 DRF 视图集上上传一个带有 PUT 的大文件 (4GB)。

在上传过程中我的记忆是稳定的。在 100% 时,python runserver 进程占用越来越多的 RAM 并被内核杀死。我在此put方法中有一个日志记录行,APIView但在此方法调用之前该进程已被终止。

我使用此设置来强制使用文件 FILE_UPLOAD_HANDLERS = ["django.core.files.uploadhandler.TemporaryFileUploadHandler"]

这个内存峰值来自哪里?我想它尝试将文件内容加载到内存中,但为什么(以及在哪里)?

更多信息:

  • 我试过 DEBUG 真假
  • runserver 位于 traefik 后面的 docker 中,但 traefik AFAIK 没有限制并且上传达到 100%
  • 我不知道我是否会得到相同的行为daphne而不是 runserver
  • 编辑:前面使用一个 Content-Type multipart/form-data
  • 编辑:我曾尝试FileUploadParser和 (FormParser, MultiPartParser)在parser_classes我APIView

Won*_*alb 5

特尔;博士:

既不是 DRF 也不是 Django 问题,这是一个2.5 年已知的达芙妮问题。解决方案是暂时使用uvicorn、hypercorn或其他东西。

说明

您在这里看到的不是来自 Django Rest Framework,因为:

你提到 Daphne 的事实让我想起了这个SO answer,它提到了一个类似的问题,并指出 Daphne 不处理大文件上传的代码,因为它在将整个主体加载到RAM 之前将其传递给视图。(在撰写本文时,该代码仍然存在于他们的 master 分支中)

您会看到与 相同的行为,runserver因为在安装时,Daphne 将初始 runserver 命令替换为自身,以提供 WebSockets 支持以用于开发目的。

为了确保它是真正的罪魁祸首,请尝试禁用 Channels/运行默认的 Django runserver 并亲自查看您的应用程序是否被 OOM Killer 杀死。