gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:09:58 25 4
gpt4 key购买 nike

我有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com