Django的查询集是否足够惰性以处理大数据集?

5
我记得在某个地方看到过Django的ORM是惰性加载对象的。假设我想要批量更新一个大量的对象(比如50万),我是否可以简单地迭代一个非常大的QuerySet,边加载、更新和保存对象,边进行操作?同样地,如果我想允许所有这些数千个对象的分页视图,我是否可以使用内置的pagination facility,还是因为所有对象的QuerySet太大,我必须每次手动运行一个窗口来查询数据集?
3个回答

3
如果你评估一个结果集有500000个结果,这是很大的,它会被缓存在内存中。相反,你可以在查询集上使用iterator()方法,它将按请求返回结果,而不会消耗大量的内存。
此外,使用update()F()对象来执行简单的批量更新操作,只需要一次查询即可完成。

1
如果批量更新可以使用SQL查询,则我认为使用sql-queries或django-orm不会有太大的区别。但是,如果更新实际上需要加载每个对象、处理数据,然后更新它们,您可以使用ORM或编写自己的SQL查询,并在每个已处理的数据上运行更新查询,开销完全取决于代码逻辑。
内置的分页功能运行limit、offset查询(如果您正确执行),因此我认为在分页中也没有太大的开销。

-2

在我的当前项目中,我对一个包含250万条记录的表进行了基准测试。

我正在阅读信息并计算记录,例如,我需要找到在某个时间范围内更新了字段“名称”的记录ID。Django基准测试使用ORM检索所有记录,然后迭代它们。数据保存在列表中以供将来处理。除了最终结果打印之外,没有任何调试输出。

另一方面,我使用MySQLdb执行相同的查询(从Django获取),并构建相同的结构,使用类存储数据并将实例保存在列表中以供将来处理。除了最终结果打印之外,没有任何调试输出。

我发现:

                      without Django  with Django
 execution time             x             10x
 memory consumption         y             25y

我只是在阅读和计数,没有执行更新/插入查询。

尝试自己调查这个问题,基准测试并不难编写和执行。


抱歉,十倍和二十五倍于什么?直接的SQL查询吗? - Joe
当我使用Django ORM时,对数据进行完整读取并执行某些操作所花费的时间是使用SQL查询和操纵检索到的数据作为Python列表的10倍,并且占用25倍的内存。 - Vestel
3
这是一个毫无意义的统计数据。而且,它取决于你如何使用ORM——例如,“len(queryset)”可能比“queryset.count()”效率要低得多。 - Daniel Roseman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接