Django - огромное использование памяти на "for" с QuerySet - PullRequest
0 голосов
/ 20 июля 2011

У меня есть такой QuerySet в Django.

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

Anyпредложения?Я знаю, что Django загружает результаты в память, но Postgres сообщает о размере таблицы около 200 МБ, поэтому ...

Ответы [ 2 ]

2 голосов
/ 20 июля 2011

Сначала убедитесь, что вы используете db_index в полях, которые вы сортируете и объединяете. Во-вторых, попробуйте итераторы набора запросов :

Для QuerySet, который возвращает большое количество объектов, это часто приводит к лучшей производительности и значительному сокращению памяти

0 голосов
/ 20 июля 2011

Если вам не нужны экземпляры модели или возвращаются только определенные поля, используйте values ​​ / values_list , чтобы выбрать только подмножество полей, которые модель имеет, и не инициализировать экземпляр моделиза каждый результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...