Django - 使用QuerySet在“for”上使用大量内存

时间:2011-07-20 07:43:29

标签: python django

我在Django中有这样的QuerySet。

j = piosenki.objects.select_related('projekt__postac').distinct().exclude(typ__in=["live", "remix"]).filter(piosenki__plyta__status=1, piosenki__plyta__typ='s')
.extra(select={ 'ocena' : 'dobroc', 'plyta' : 'SELECT plyta_id FROM plyty_piosenki INNER JOIN plyty_plyty ON plyty_plyty.id = plyty_piosenki.plyta_id WHERE piosenka_id = muzyka_piosenki.id AND plyty_plyty.typ = \'s\' ORDER BY plyty_plyty.id DESC LIMIT 1' })

当我用for语句循环它时,只需打印“id”,内存一直在增长,直到......

[1286986.701097] Killed process 4627 (python2.6) total-vm:731872kB, anon-rss:635724kB, file-rss:268kB
[1286986.768701] python2.6: page allocation failure. order:0, mode:0x201da
[1286986.768705] Pid: 4627, comm: python2.6 Not tainted 2.6.39-gentoo-r2 #1

有什么建议吗?我知道Django将结果加载到内存中,但Postgres报告表的大小约为200 MB,所以......

2 个答案:

答案 0 :(得分:2)

首先,确保在排序和加入的字段上使用db_index。其次,尝试queryset iterators

  

对于返回大量对象的QuerySet,这通常是   导致更好的性能和显着的内存减少

答案 1 :(得分:0)

如果您不需要模型实例或仅返回某些字段,请使用values / values_list仅选择模型具有的字段子集,而不是为每个结果初始化模型实例。