2013-08-15 7 views
6

Beim Profiling meiner Python2.7 App Engine App, finde ich, dass es im Durchschnitt 7ms pro Datensatz benötigt, um Einträge, die von ndb in Python-Objekte geholt wurden, zu deserialisieren. (In pb_to_query_result, pb_to_entity und ihren Nachkommen - dies beinhaltet nicht die RPC-Zeit, um die Datenbank abzufragen und die Rohdatensätze zu empfangen.)App Engine Deserialisierung von Datensätzen in Python: Ist das wirklich so langsam?

Wird dies erwartet? Mein Modell hat sechs Eigenschaften, eine davon ist eine LocalStructuredProperty mit 15 Eigenschaften, die auch eine wiederholte StructuredProperty mit vier Eigenschaften enthält, aber das durchschnittliche Objekt sollte insgesamt weniger als 30 Eigenschaften haben, denke ich.

Soll es so langsam sein? Ich möchte ein paar tausend Datensätze abrufen, um eine einfache Aggregatanalyse durchzuführen, und obwohl ich eine gewisse Latenz tolerieren kann, sind mehr als 10 Sekunden ein Problem. Kann ich etwas tun, um meine Modelle oder mein Schema so umzugestalten, dass dies realisierbar wird? (Anders als die naheliegende Lösung, meine Aggregatanalyse regelmäßig vorzuberechnen und die Ergebnisse zwischenzuspeichern.)

Wenn es ungewöhnlich ist, dass es so langsam ist, wäre es hilfreich, das zu wissen, damit ich hingehen und schauen kann Was ich tun könnte, beeinträchtigt das.

Antwort

7

Kurze Antwort: ja.

Ich finde Deserialisierung in Python sehr langsam, vor allem, wenn wiederholte Eigenschaften beteiligt sind. Offenbar erzeugt die GAE-Python-Deserialisierung Schiffsladungen von Objekten. Es ist bekannt, ineffizient zu sein, aber auch scheinbar will niemand es berühren, weil es so weit unten ist.

Es ist bedauerlich. Wegen dieses Overheads (d. H. Schnellere CPU == schnellere Deserialisierung) laufen die F4 Frontends die meiste Zeit.