从Django获得百万记录,queryset是s

2024-03-28 09:18:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我想迭代一个表的所有对象(Post) 我正在使用以下代码:

posts = Post.objects.all()
for post in posts:
   process_post(post)

process_post是一个芹菜任务,它将在后台运行,并且不会更新张贴。但是我的问题是Post table有100万记录。这个不是一次性的工作,我每天都在做。在

^{pr2}$

在上面的行中,调用查询,它一次性从数据库中获取所有数据。在

如何提高它的性能? 有什么方法可以成批获取数据吗?在


Tags: 对象代码inforobjects记录tableall
2条回答

制作您自己的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进行切片将使用LIMITOFFSET用法。查询可以根据chunk_size的增加而减少,其中内存使用也会增加。为你的用例优化它。在

我的第一个建议是使用select_-related或prefetch-related。仔细阅读django的文档并了解它,它应该可以解决您的问题。但正如你所说,你有数百万条记录。重复这些将永远是一项昂贵的业务。如果process_post方法需要时间,最好的解决方案是使用存储过程。您只需向db发出一个请求就可以实现目标,而不是在循环中进行数百万次db调用。在

相关问题 更多 >