![]() |
1
105
内特C很接近,但不是很接近。 从 the docs :
因此,当您第一次进入该循环并获得queryset的迭代形式时,将同时检索您的1000万行。您所经历的等待是Django加载数据库行并为每个行创建对象,然后返回一些您可以实际迭代的内容。然后你就把所有的事情都记在记忆里了,结果就出来了。
从我对文件的阅读来看,
高效地迭代大型数据集是我们还没有完全解决的问题,但是有一些片段可能对您的目的很有用: |
![]() |
2
38
可能不是最快或最有效的,但作为现成的解决方案,为什么不使用这里记录的django core的Paginator和Page对象: https://docs.djangoproject.com/en/dev/topics/pagination/ 像这样的:
|
![]() |
3
26
Django的默认行为是在查询求值时缓存QuerySet的整个结果。您可以使用QuerySet的迭代器方法来避免这种缓存:
https://docs.djangoproject.com/en/dev/ref/models/querysets/#iterator 迭代器()方法计算queryset,然后直接读取结果,而不在queryset级别进行缓存。这种方法在遍历大量只需访问一次的对象时,可以获得更好的性能和显著的内存减少。请注意,缓存仍在数据库级别进行。 使用iterator()可以减少内存使用,但仍然比我预期的要高。使用mpaf建议的paginator方法占用的内存要少得多,但是对于我的测试用例来说要慢2-3倍。
|
![]() |
4
8
这是来自文档: http://docs.djangoproject.com/en/dev/ref/models/querysets/
所以当
但如果你这样做:
http://docs.djangoproject.com/en/dev/topics/db/queries/#limiting-querysets 然后它将在内部向sql添加偏移量和限制。 |
![]() |
5
7
对于大量的记录 database cursor 表现更好。在Django中确实需要原始SQL,Django游标不同于SQL游标。 Nate C建议的极限偏移方法可能适合您的情况。对于大量数据,它比游标慢,因为它必须一遍又一遍地运行同一个查询,并且必须跳过越来越多的结果。 |
![]() |
6
7
Django在从数据库获取大型项方面没有很好的解决方案。
values_list 可用于获取数据库中的所有ID,然后分别获取每个对象。在一段时间内,大对象将被创建在内存中,不会被垃圾收集TIL退出循环。上面的代码在每100个项目被消耗后进行手动垃圾收集。 |
![]() |
7
5
因为这样一来,整个queryset的对象会同时加载到内存中。你需要把你的查询集分成可消化的小块。这样做的模式称为勺送。下面是一个简短的实现。
要使用此功能,请编写对对象执行操作的函数:
然后在queryset上运行该函数:
这可以通过执行多处理进一步改进
|
![]() |
8
3
这里有一个包括len和count的解决方案:
用法:
|
![]() |
9
0
对于此类任务,我通常使用原始MySQL原始查询而不是Django ORM。 MySQL支持流模式,因此我们可以安全、快速地遍历所有记录,而不会出现内存不足错误。
裁判: |
![]() |
nadermx · Django中的原始sql查询问题 3 年前 |
![]() |
liansheng · 在Django。如何使用字段长度[重复]排序 7 年前 |
![]() |
bkramer · 订单重要时成功尝试分组查询 7 年前 |
![]() |
martin_crd · Django中多个表的筛选和排序结果 7 年前 |
![]() |
Phil Sheard · 使用大型子查询优化Django查询 7 年前 |
![]() |
Max Malysh · 如何从Django找到Postgres版本? 7 年前 |