我记得在某个地方看到过Django的ORM是惰性加载对象的。假设我想要批量更新一个大量的对象(比如50万),我是否可以简单地迭代一个非常大的QuerySet,边加载、更新和保存对象,边进行操作?同样地,如果我想允许所有这些数千个对象的分页视图,我是否可以使用内置的pagination facility,还是因为所有对象的QuerySet太大,我必须每次手动运行一个窗口来查询数据集?
iterator()
方法,它将按请求返回结果,而不会消耗大量的内存。update()
和F()
对象来执行简单的批量更新操作,只需要一次查询即可完成。在我的当前项目中,我对一个包含250万条记录的表进行了基准测试。
我正在阅读信息并计算记录,例如,我需要找到在某个时间范围内更新了字段“名称”的记录ID。Django基准测试使用ORM检索所有记录,然后迭代它们。数据保存在列表中以供将来处理。除了最终结果打印之外,没有任何调试输出。
另一方面,我使用MySQLdb执行相同的查询(从Django获取),并构建相同的结构,使用类存储数据并将实例保存在列表中以供将来处理。除了最终结果打印之外,没有任何调试输出。
我发现:
without Django with Django
execution time x 10x
memory consumption y 25y
我只是在阅读和计数,没有执行更新/插入查询。
尝试自己调查这个问题,基准测试并不难编写和执行。