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