Django的QuerySets是否足够懒惰以应对大型数据集?

时间:2010-01-26 17:26:12

标签: django django-models lazy-loading

我想我已经读过Django的ORM懒洋洋地加载对象的地方。假设我想在批量更新操作中更新大量对象(比如500,000)。是否可以简单地迭代一个非常大的QuerySet,加载,更新和保存对象?

同样,如果我想允许所有这些数千个对象的分页视图,我可以使用内置的pagination facility,还是我每次都需要手动操作数据集的窗口因为所有对象的QuerySet的大小?

3 个答案:

答案 0 :(得分:3)

如果你评估一个500000结果的查询集,它很大,它将被缓存在内存中。相反,您可以在查询集上使用iterator()方法,该方法将按要求返回结果,而不会消耗大量内存。

此外,使用update()F()个对象,以便在单个查询中进行简单的批量更新。

答案 1 :(得分:1)

如果使用SQL查询可以进行批量更新,那么我认为使用sql-queries或django-orm不会产生重大影响。但是如果更新实际上需要加载每个对象,处理数据然后更新它们,您可以使用orm或编写自己的sql查询并对每个处理过的数据运行更新查询,开销完全取决于代码逻辑。 / p>

内置的分页工具运行限制,偏移查询(如果你这样做是正确的),所以我不认为分页中有很大的开销......

答案 2 :(得分:-2)

当我使用一个表中的2.5M记录数据集对我当前项目进行基准测试时。

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

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

我发现:

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

我只是在阅读和计算,而不执行更新/插入查询。

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