2010-01-26 28 views
4

我想我读过Django的ORM懒洋洋地加载对象的地方。比方说,我想在批量更新操作中更新一大组对象(比如500,000)。我可以简单地遍历一个非常大的QuerySet,加载,更新和保存对象吗?Django的QuerySets是否足够缓慢以应对大数据集?

同样,如果我想允许所有这些成千上万的对象的分页视图,我可以使用内置的pagination facility或手动必须每次运行一个数据集上的窗口,因为所有对象的QuerySet的大小?

回答

1

如果批量更新,可以使用SQL查询,然后我想使用SQL查询或者Django的ORM不会作出重大的区别。但是如果更新实际上需要加载每个对象,处理数据然后更新它们,则可以使用orm或编写自己的sql查询并针对每个处理后的数据运行更新查询,开销完全取决于代码逻辑。

内置分页设备运行的限制,偏移查询(如果你正在做它正确的),所以我不认为有在分页主要开销要么..

+0

谢谢。不,更新在查询中不可行。 – Joe 2010-01-26 19:36:53

-2

正如我这个基准为我在一个表中的记录2.5M数据集当前项目。

我读信息和统计记录,例如,我需要找到的记录,这些领域的“名”是在一定的时间内更新一次以上的ID。 Django基准测试使用ORM来检索所有记录,然后遍历它们。数据保存在列表中供将来处理。没有任何调试输出,除了结果打印结束。

在另一端,我是使用其执行相同的查询(从Django中得到)和构建相同的结构,使用类用于存储数据和在列表中保存的实例以供将来处理MySQLdb的。没有任何调试输出,除了结果打印结束。

我发现:

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

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

尝试探讨这个问题自己,基准是并不难写和执行。

+0

对不起10倍和25倍以上?直接的SQL查询? – Joe 2010-01-26 17:33:20

+0

当我使用Django ORM时,与使用SQL查询和将检索数据作为python列表操作时相比,完全读取数据并执行一些活动花费了10倍的时间和25倍的内存。 – Vestel 2010-01-26 18:03:56

+3

-1。这是一个毫无意义的统计数据。另外,这取决于你如何使用ORM - 例如'len(queryset)'可能比'queryset.count()'效率低得多。 – 2010-01-26 19:29:01

3

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

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

相关问题