Как ускорить итерацию больших наборов данных в Django - PullRequest
6 голосов
/ 14 апреля 2011

У меня есть набор запросов из примерно 1500 записей из запроса Django ORM. Я использовал методы select_related () и only (), чтобы убедиться в строгости запроса. Я также использовал connection.queries, чтобы убедиться, что есть только этот один запрос. То есть я позаботился о том, чтобы на каждой итерации не вызывалось никаких дополнительных запросов.

Когда я запускаю запрос вырезать и вставить из connection.queries, он выполняется за 0,02 секунды. Тем не менее, требуется семь секунд, чтобы перебрать эти записи и ничего не делать с ними (проход).

Что я могу сделать, чтобы ускорить это? Что вызывает эту медлительность?

Ответы [ 4 ]

14 голосов
/ 14 апреля 2011

QuerySet может быть довольно тяжелым, когда он полон объектов модели.В подобных ситуациях я использовал метод .values ​​в наборе запросов, чтобы указать нужные мне свойства в виде списка словарей, который может быть намного быстрее перебирать.http://docs.djangoproject.com/en/1.3/ref/models/querysets/#values-list

2 голосов
/ 14 апреля 2011

Как вы перебираете каждый элемент:

items = SomeModel.objects.all()

Обычный для цикла на каждом

for item in items:
    print item

Или с помощью итератора QuerySet

for item in items.iterator():
    print item

Согласно документу, iterator() может улучшить производительность. То же самое относится к циклу очень большого списка или словарей Python, лучше использовать iteritems().

2 голосов
/ 14 апреля 2011

1500 записей - это далеко не большой набор данных, а семь секунд - это слишком много.Вероятно, есть какая-то проблема в ваших моделях, вы можете легко проверить ее, получив (как говорит Брэндон) запрос values ​​(), а затем явно создать объект 1500 путем итерации словаря.Просто преобразуйте ValuesQuerySet в список перед построением, чтобы выделить соединение БД.

1 голос
/ 14 апреля 2011

Указывает ли объявление вашей модели Meta "упорядочить по" полю, которое хранится в некоторой другой связанной таблице?Если это так, ваша попытка выполнить итерацию может вызвать 1500 запросов, поскольку Django убегает, захватывает это поле для каждого элемента и затем сортирует их.Если вы покажете нам свой код, это поможет нам решить проблему!

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