Django (?) действительно замедляется с большими наборами данных после выполнения некоторого профилирования Python

4 ответа

AspectC ++ - это то, что вам нужно. Я сам не использовал его, но парадигма аспектно-ориентированного программирования пытается решить именно эту проблему.

особенно если вы выполняете обработку на основе набора записей - базы данных съедают такую ​​обработку с завтрака. В Django вы можете отправлять RAW SQL в базу данных: http://docs.djangoproject.com/en/dev/topics/db/sql/#topics-db-sql

Я надеюсь, что это, по крайней мере, может указать в правильном направлении ...

6
ответ дан 13 December 2019 в 19:32
поделиться

"tokenize.py выходит на первое место, что может иметь некоторый смысл, поскольку я много форматирую числа."

Не имеет никакого смысла.

См. http://docs.python.org/library/tokenize.html .

Модуль tokenize предоставляет лексический сканер исходного кода Python, реализовано в Python

Tokenize, выходящий на первое место, означает, что у вас идет динамический синтаксический анализ кода.

AFAIK (выполнение поиска в репозитории Django) Django не использует tokenize. Таким образом, ваша программа выполняет какое-то динамическое создание экземпляра кода. Или вы профилируете только первый раз, когда ваша программа загружается, анализируется и запускается, что приводит к ложным предположениям о том, где идет время.

Вы не должны никогда делать расчет в тегах шаблонов - медленно. Он включает в себя сложную мета-оценку тега шаблона. Все вычисления в представлении следует выполнять на простом языке Python с небольшими накладными расходами. Используйте шаблоны только для презентации.

Кроме того, если вы постоянно выполняете запросы, фильтры, суммы и т. Д., У вас есть хранилище данных. Получите книгу по проектированию хранилищ данных, и следуйте шаблонам проектирования хранилищ данных.

У вас должна быть центральная таблица фактов, окруженная таблицами измерений. Это очень и очень эффективно.

Суммы, группировки и т. Д. Могут быть выполнены как операции defaultdict в Python. Произвести массовую выборку всех строк, построив словарь с желаемыми результатами. Если это слишком медленно, тогда вам придется использовать методы хранилища данных для сохранения постоянных сумм и групп отдельно от ваших подробных фактов. Часто это включает выход за пределы Django ORM и использование функций СУБД, таких как представления или таблицы производных данных.

построение словаря с желаемыми результатами. Если это слишком медленно, тогда вам придется использовать методы хранилища данных для сохранения постоянных сумм и групп отдельно от ваших подробных фактов. Часто это включает выход за пределы Django ORM и использование функций СУБД, таких как представления или таблицы производных данных.

построение словаря с желаемыми результатами. Если это слишком медленно, тогда вам придется использовать методы хранилища данных для сохранения постоянных сумм и групп отдельно от ваших подробных фактов. Часто это включает выход за пределы Django ORM и использование функций СУБД, таких как представления или таблицы производных данных.

2
ответ дан 13 December 2019 в 19:32
поделиться

При работе с большими наборами данных вы также можете сэкономить много ресурсов процессора и памяти, используя ValuesQuerySet , который обеспечивает более прямой доступ к результатам запроса вместо создания модели. экземпляр объекта для каждой строки результата.

Его использование выглядит примерно так:

Blog.objects.order_by('id').values()
2
ответ дан 13 December 2019 в 19:32
поделиться

В таком сценарии база данных часто является узким местом. Кроме того, использование ORM может привести к неоптимальным SQL-запросам.

Как отмечали некоторые, невозможно определить, что на самом деле представляет собой проблема, только с помощью предоставленной вами информации.

Я просто могу дать вам несколько общих советов. :

  • Если ваше представление работает со связанными объектами модели, рассмотрите возможность использования select_related () . Этот простой метод может значительно ускорить запросы, генерируемые ORM.
  • Используйте Промежуточное ПО для нижнего колонтитула отладки , чтобы узнать, какие SQL-запросы генерируются вашими представлениями и сколько времени им потребовалось для выполнения.

PS : Просто к сведению, однажды у меня было довольно простое представление, которое было очень медленным. После установки ПО промежуточного слоя отладки нижнего колонтитула я увидел это около 500! sql-запросы выполнялись в этом единственном представлении. Простое использование select_related () уменьшило количество запросов до 5, и просмотр выполнялся, как ожидалось.

После установки ПО промежуточного слоя отладки нижнего колонтитула я увидел это около 500! sql-запросы выполнялись в этом единственном представлении. Простое использование select_related () уменьшило количество запросов до 5, и просмотр выполнялся, как ожидалось.

После установки ПО промежуточного слоя отладки нижнего колонтитула я увидел это около 500! sql-запросы выполнялись в этом единственном представлении. Простое использование select_related () уменьшило количество запросов до 5, и просмотр выполнялся, как ожидалось.

1
ответ дан 13 December 2019 в 19:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: