我有一个任务需要每隔一段时间(每天一次,每周一次,等等)在我的数据库中的“大多数”对象上运行一次。基本上这意味着我有一些查询看起来像在它自己的线程中运行。
for model_instance in SomeModel.objects.all():
do_something(model_instance)
(请注意,它实际上是一个 filter() 不是 all(),但尽管如此,我仍然最终选择了 非常大 组对象。)
我遇到的问题是,在运行一段时间后,由于我使用了太多内存,我的托管服务提供商杀死了该线程。我假设所有这些内存使用都在发生,因为即使我的查询返回的 QuerySet
对象最初的内存占用非常小,但它最终会随着 而增长QuerySet
对象在我遍历它们时缓存每个 model_instance
。
我的问题是,“以内存高效的方式迭代数据库中几乎每个 SomeModel
的最佳方法是什么?”或者我的问题是“如何从 django 查询集中‘取消缓存’模型实例?”
编辑:我实际上是在使用查询集的结果来构建一系列新对象。因此,我根本不会更新查询的对象。
最佳答案
如何使用此处记录的 django core 的 Paginator 和 Page 对象:
https://docs.djangoproject.com/en/dev/topics/pagination/
类似这样的:
from django.core.paginator import Paginator
from djangoapp.models import SomeModel
paginator = Paginator(SomeModel.objects.all(), 1000) # chunks of 1000
for page_idx in range(1, paginator.num_pages):
for row in paginator.page(page_idx).object_list:
# here you can do what you want with the row
print "done processing page %s" % page_idx
关于python - 限制 *Large* Django QuerySet 中的内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4856882/