我想我已经读过Django的ORM懒洋洋地加载对象的地方。假设我想在批量更新操作中更新大量对象(比如500,000)。是否可以简单地迭代一个非常大的QuerySet,加载,更新和保存对象?
同样,如果我想允许所有这些数千个对象的分页视图,我可以使用内置的pagination facility,还是我每次都需要手动操作数据集的窗口因为所有对象的QuerySet的大小?
答案 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
我只是在阅读和计算,而不执行更新/插入查询。
尝试自己研究这个问题,基准测试不难编写和执行。