python - 如何在不耗尽内存的情况下迭代 Django 中的大表?

标签 python django

我有一个 Django 模型,其表中有数百万条记录。我正在尝试对 shell 中表中的所有记录进行一些紧急维护,但如果不完全耗尽系统内存,我将无法执行 MyModel.objects.all()

即使是 pass 也会导致 OOM killer 被调用,杀死我的进程:

for ii in MyModel.objects.all():
    pass

原因是因为 Django 的 QuerySet 正在尝试建立它的“结果缓存”,方法是建立一个包含我的所有记录的列表,这里: p>

# django/db/models/query.py
def _fetch_all(self):
    if self._result_cache is None:
        self._result_cache = list(self.iterator())  # <<<< this guy!
    if self._prefetch_related_lookups and not self._prefetch_done:
        self._prefetch_related_objects()

但是我的机器无法将整个列表保存在内存中。

当然,在如此大的表上迭代 .all() 在真实的应用程序中将是一个糟糕的想法,因此这个问题的范围相当有限(维护事件)但它确实出现了不时上来。

最佳答案

首先要尝试的是使用 iterator()在迭代之前查询集上的方法:

for ii in MyModel.objects.all().iterator():

关于python - 如何在不耗尽内存的情况下迭代 Django 中的大表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38959478/

相关文章:

python - Django 是在服务器上还是在浏览器中执行脚本?

django - 迁移后 django 管理站点中不存在关系

docker 容器中的 django + nginx : can not upload any file with forms

python - 脚本是否可以打开 WSL bash shell 并向其发送命令?

python - 使用docker时无法使用pipenv安装软件包

python - opencv - python - 在 cv2.inRange 中使用 HSV 颜色时感到困惑

python - 用于根据长度过滤单词或通过排除 Python 中的单词的正则表达式

python - Selenium:动态加载页面导致自动滚动失败

python - 使用 django_nose 和 django-dynamic-fixture 优化示例 django 模型的设置和拆卸

ajax - 常规请求期间 Django AJAX 请求未通过