2012-04-03 23 views
6

Zrobiłem aplikację kliencką, która używa protokołu HTTP do komunikacji z serwerem Python 2 przy użyciu prostego interfejsu API. Serwer wykorzystuje dość ORM SQLAlchemy do obsługi danych dla tych żądań HTTP. Problem polega na tym, że wykorzystanie mojego procesora jest dość wysokie, nawet przy niewielu aktywnych klientach. Ten serwer powinien być w stanie obsłużyć kilkuset klientów jednocześnie na około 1 żądanie na sekundę na klienta, więc nadal powinno być możliwe do zarządzania (a przynajmniej taką mam nadzieję).Jak poprawić wydajność SQLAlchemy?

Jak mogę poprawić wydajność? Wiem, że problemem jest ORM, ponieważ cProfile pokazuje to całkiem wyraźnie. Pojedyncze zapytanie najwyraźniej wykonuje około 10000 instrukcji w języku Python, co wydaje się dość dziwne. Próbowałem podłączyć różne silniki baz danych/backend i zmieniłem interpreter na Pypy dla zabawy, ale oczywiście nie pomogło to pierwotnemu problemowi, a także nie poprawiło wydajności.

Co ja tu robię źle? Naprawdę mam nadzieję, że to "dobrze, duh!" problem.

Czy moje relacje powinny być innego rodzaju? chętni, leniwi, dynamiczni, itp.? W tej chwili nie precyzuję niczego szczególnego.

Pomoc bardzo doceniona.

+5

spójrz na moją odpowiedź http://stackoverflow.com/questions/1171166/how-can-i-profile-a-sqlalchemy-powered-application/1175677#1175677 dla niektórych miejsc, aby rozpocząć – zzzeek

Odpowiedz

0

Jak dynamiczne są zapytania, czy jest to tylko jeden typ obiektu, który zawsze jest zwracany, czy jest to wiele różnych modeli. Ile wierszy wracasz? Czy możesz ograniczyć liczbę kolumn lub liczbę wierszy? Przy dużych ilościach danych przy założeniu, że wszystko jest już łatwe, nawet konwersja przez pythona kolumn na poprawne typy danych może spowodować przyzwoitą ilość narzutów.

Mam również SQLAlchemy tylko do szybkich projektów, ale czy jest możliwe, że użycie procesora rośnie podczas oczekiwania na wyniki? Jeśli to jest twój problem, możesz chcieć zanurkować w profilowaniu rzeczywistych zapytań i upewnić się, że są odpowiednio indeksowane i że orm generuje je w optymalny sposób.

+0

Zapytania SQL są całkiem nieliczne i zwracają bardzo małe kieszonki z przedmiotami. Większość czasu spędza się w samym ORM. – Svenstaro

Powiązane problemy