python - 限制 *Large* Django QuerySet 中的内存使用

标签 python django memory-management django-queryset

我有一个任务需要每隔一段时间(每天一次,每周一次,等等)在我的数据库中的“大多数”对象上运行一次。基本上这意味着我有一些查询看起来像在它自己的线程中运行。

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/

相关文章:

python - MySql:如何知道一个条目是否被压缩

具有可变上限的 Python 双变量正态 CDF

python - Pyramid 配置 .ini 文件,setup.py 和 requirements.txt

python - Django 1.5 为 pk > 999 提供 404

python - Django-Simple-Captcha 添加CSS

javascript - 通过 Markdown 解析器在 HTML 渲染期间删除第一行 block

mysql - Django 2.0 - Python3.6 - CentOS 7 - MySQL 连接

memory-leaks - 减少扩展 Mathematica session 中的内存使用量

c++ - C++ 中的不可变类和内存

MySQL 不使用可用内存