2024-03-28 09:18:11 发布
网友
我想迭代一个表的所有对象(Post) 我正在使用以下代码:
posts = Post.objects.all() for post in posts: process_post(post)
process_post是一个芹菜任务,它将在后台运行,并且不会更新张贴。但是我的问题是Post table有100万记录。这个不是一次性的工作,我每天都在做。在
process_post
在上面的行中,调用查询,它一次性从数据库中获取所有数据。在
如何提高它的性能? 有什么方法可以成批获取数据吗?在
制作您自己的iterator。例如,假设1 million个记录。在
iterator
1 million
count = Post.objects.all().count() #1 million chunk_size = 1000 for i in range(0, count, chunk_size): posts = Post.objects.all()[i:i+chunk_size] for post in posts: process_post(post)
对queryset进行切片将使用LIMIT,OFFSET用法。查询可以根据chunk_size的增加而减少,其中内存使用也会增加。为你的用例优化它。在
LIMIT
OFFSET
chunk_size
我的第一个建议是使用select_-related或prefetch-related。仔细阅读django的文档并了解它,它应该可以解决您的问题。但正如你所说,你有数百万条记录。重复这些将永远是一项昂贵的业务。如果process_post方法需要时间,最好的解决方案是使用存储过程。您只需向db发出一个请求就可以实现目标,而不是在循环中进行数百万次db调用。在
制作您自己的
iterator
。例如,假设1 million
个记录。在对queryset进行切片将使用
LIMIT
,OFFSET
用法。查询可以根据chunk_size
的增加而减少,其中内存使用也会增加。为你的用例优化它。在我的第一个建议是使用select_-related或prefetch-related。仔细阅读django的文档并了解它,它应该可以解决您的问题。但正如你所说,你有数百万条记录。重复这些将永远是一项昂贵的业务。如果process_post方法需要时间,最好的解决方案是使用存储过程。您只需向db发出一个请求就可以实现目标,而不是在循环中进行数百万次db调用。在
相关问题 更多 >
编程相关推荐