2012-04-03 21 views
6

Ich habe eine Client-Anwendung erstellt, die HTTP verwendet, um über eine einfache API mit einem Python 2-Server zu kommunizieren. Der Server verwendet das ORM von SQLAlchemy ziemlich umfangreich, um die Daten für diese HTTP-Anforderungen bereitzustellen. Das Problem ist, dass meine CPU-Auslastung ziemlich hoch ist, selbst mit nur wenigen aktiven Clients. Dieser Server sollte in der Lage sein, ein paar hundert Clients gleichzeitig mit etwa einer Anfrage pro Sekunde pro Client zu bedienen, so dass es immer noch überschaubar sein sollte (oder ich hoffe).Wie verbessert man SQLAlchemy Leistung?

Wie kann ich die Leistung verbessern? Ich weiß das Problem ist das ORM als cProfile zeigt dies ganz deutlich. Eine einzige Abfrage führt anscheinend ungefähr 10000 Python-Anweisungen aus, was ziemlich merkwürdig erscheint. Ich habe versucht, verschiedene Datenbank-Engines/Backends einzubauen und habe den Interpreter nur zum Spaß in Pypy geändert, aber das hat offensichtlich nicht zum ursprünglichen Problem beigetragen und auch die Performance nicht verbessert.

Was mache ich hier falsch? Ich hoffe wirklich, das ist ein "gut, duh!" Problem.

Sollten meine Beziehungen von einem anderen Typ sein? eifrig, faul, dynamisch, etc? Im Moment spezifiziere ich nichts speziell.

Hilfe sehr geschätzt.

+5

werfen Sie einen Blick auf meine Antwort http://stackoverflow.com/questions/1171166/how-can-i-profile-a-sqlalchemy-powered-application/1175677#1175677 für einige Stellen zu starten – zzzeek

Antwort

0

Wie dynamisch sind die Abfragen, wird immer nur ein Objekttyp zurückgegeben oder sind es viele verschiedene Modelle? Wie viele Zeilen kommst du zurück? Können Sie die Anzahl der Spalten oder die Anzahl der Zeilen begrenzen? Bei großen Datenmengen unter der Annahme, dass alles leicht zu lösen ist, kann selbst Python, das die Spalten in die richtigen Datentypen konvertiert, einen ansehnlichen Aufwand verursachen.

Auch ich habe SQLAlchemy nur für schnelle Projekte, aber ist es möglich, die CPU-Nutzung ist Spike, während es auf Ergebnisse wartet? Wenn das Ihr Problem ist, sollten Sie in das Profiling der tatsächlichen ausgeführten Abfragen einsteigen und sicherstellen, dass sie richtig indiziert sind und dass das Orm sie auf optimale Weise generiert.

+0

Die SQL-Abfragen sind ziemlich wenige und zurück sehr kleine Taschen von Gegenständen. Die meiste Zeit wird im ORM selbst verbracht. – Svenstaro

Verwandte Themen