Ben*_*min 4 django django-rest-framework
我尝试在 DRF 视图集上上传一个带有 PUT 的大文件 (4GB)。
在上传过程中我的记忆是稳定的。在 100% 时,python runserver 进程占用越来越多的 RAM 并被内核杀死。我在此put方法中有一个日志记录行,APIView但在此方法调用之前该进程已被终止。
我使用此设置来强制使用文件 FILE_UPLOAD_HANDLERS = ["django.core.files.uploadhandler.TemporaryFileUploadHandler"]
这个内存峰值来自哪里?我想它尝试将文件内容加载到内存中,但为什么(以及在哪里)?
更多信息:
daphne而不是 runserverContent-Type multipart/form-dataFileUploadParser和 (FormParser, MultiPartParser)在parser_classes我APIView既不是 DRF 也不是 Django 问题,这是一个2.5 年已知的达芙妮问题。解决方案是暂时使用uvicorn、hypercorn或其他东西。
您在这里看到的不是来自 Django Rest Framework,因为:
request.FILES属性之前未执行的解析器你提到 Daphne 的事实让我想起了这个SO answer,它提到了一个类似的问题,并指出 Daphne 不处理大文件上传的代码,因为它在将整个主体加载到RAM 之前将其传递给视图。(在撰写本文时,该代码仍然存在于他们的 master 分支中)
您会看到与 相同的行为,runserver因为在安装时,Daphne 将初始 runserver 命令替换为自身,以提供 WebSockets 支持以用于开发目的。
为了确保它是真正的罪魁祸首,请尝试禁用 Channels/运行默认的 Django runserver 并亲自查看您的应用程序是否被 OOM Killer 杀死。
| 归档时间: |
|
| 查看次数: |
776 次 |
| 最近记录: |