【发布时间】:2017-04-21 10:26:45
【问题描述】:
我想迭代一个表的所有对象(Post) 我正在使用以下代码:
posts = Post.objects.all()
for post in posts:
process_post(post)
process_post 是一项 celery 任务,它将在后台运行并且不会更新帖子。但我遇到的问题是 Post 表有 100 万条记录。这不是一次性工作。我每天都在运行它。
for post in posts
在上面一行中,调用了 Query,它一次性从 DB 中获取所有数据。
如何提高其性能? 有什么方法可以批量获取数据吗?
【问题讨论】:
-
process_post是更新方法吗? -
使用
iterator()。如果它仍然导致过多的内存消耗,您可能需要考虑使用数据库端游标。 -
数据是由 Django 批量获取的。实际上,默认行为是加载所有内容。但是将行加载为 python 对象是一个缓慢的过程,如果你只有简单的处理,我建议你使用
values()和update(),如果可能的话甚至单独使用update()。 ...并使其处理自定义管理器或查询集方法。 -
select_related() 和 prefetch_related() 对我优化 django 查询非常有用。这篇文章可能会有所帮助:bookofstranger.com/…
-
@Surajano process_post 是一个 celery 任务,它将在后台运行并且不会更新帖子
标签: python django postgresql