我在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,所以......
答案 0 :(得分:2)
首先,确保在排序和加入的字段上使用db_index。其次,尝试queryset iterators:
对于返回大量对象的QuerySet,这通常是 导致更好的性能和显着的内存减少
答案 1 :(得分:0)
如果您不需要模型实例或仅返回某些字段,请使用values / values_list仅选择模型具有的字段子集,而不是为每个结果初始化模型实例。