Как улучшить производительность SQLAlchemy? - PullRequest
6 голосов
/ 03 апреля 2012

Я создал клиентское приложение, которое использует HTTP для связи с сервером Python 2 с помощью простого API. Сервер достаточно широко использует ORM SQLAlchemy для обслуживания данных этих HTTP-запросов. Проблема в том, что загрузка моего процессора довольно высока, даже с несколькими активными клиентами. Этот сервер должен одновременно обслуживать несколько сотен клиентов со скоростью примерно 1 запрос в секунду на каждого клиента, поэтому он все еще должен быть управляемым (или, я надеюсь, таким).

Как я могу улучшить производительность? Я знаю, что проблема в ORM, так как cProfile показывает это довольно четко. Один запрос выполняет около 10000 инструкций Python, что выглядит довольно странно. Я попытался подключить разные движки баз данных / серверные части и изменил интерпретатор на Pypy просто для удовольствия, но это, очевидно, не помогло первоначальной проблеме, а также не улучшило производительность.

Что я здесь не так делаю? Я действительно надеюсь, что это "хорошо, дух!" проблема.

Должны ли мои отношения быть другого типа? нетерпеливый, ленивый, динамичный и т. д.? Прямо сейчас я не уточняю ничего конкретного.

Помощь с благодарностью.

1 Ответ

0 голосов
/ 19 апреля 2012

Насколько динамичны запросы, это всегда один тип возвращаемого объекта или много разных моделей. Сколько строк вы возвращаете? Можете ли вы ограничить количество столбцов или количество строк? При огромных объемах данных при условии, что все уже исправлено, даже преобразование столбцов в правильные типы данных с помощью python может привести к значительным издержкам.

Кроме того, у меня есть SQLAlchemy только для быстрых проектов, но возможно ли, что загрузка процессора увеличивается, пока он ожидает результатов? Если это ваша проблема, вы, возможно, захотите погрузиться в профилирование выполняемых запросов и убедиться, что они правильно проиндексированы и что Orm генерирует их оптимальным образом.

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