2013-08-15 12 views
6

Nella profilatura dell'app python2.7 App Engine, trovo che impiega una media di 7 ms per record per deserializzare i record recuperati da ndb in oggetti python. (In pb_to_query_result e pb_to_entity e i loro discendenti-questo non include l'ora RPC per interrogare il database e ricevere i record non elaborati.)App Engine deserializing record in python: è davvero così lento?

È previsto? Il mio modello ha sei proprietà, una delle quali è una LocalStructuredProperty con 15 proprietà, che include anche una ripetuta StructuredProperty con quattro proprietà, ma l'oggetto medio dovrebbe avere meno di 30 proprietà tutte dette, credo.

Si prevede che sia così lento? Voglio recuperare un paio di migliaia di record per fare una semplice analisi aggregata, e mentre posso tollerare una certa quantità di latenza, oltre 10 secondi è un problema. C'è qualcosa che posso fare per ristrutturare i miei modelli o il mio schema per renderlo più vitale? (Oltre all'ovvia soluzione di precalcolare la mia analisi aggregata su base regolare e memorizzando i risultati nella cache.)

Se è insolito che sia così lento, sarebbe utile sapere che così posso andare a guardare perché quello che potrei fare lo rovina.

risposta

7

Risposta breve: sì.

Trovo che la deserializzazione in Python sia molto lenta, specialmente quando sono coinvolte proprietà ripetute. Apparentemente, la deserializzazione GAE-Python crea imbarcazioni di oggetti. È noto per essere inefficiente, ma anche apparentemente, nessuno vuole toccarlo perché è così in fondo alla pila.

È un peccato. Eseguiamo F4 Front End per la maggior parte del tempo a causa di questo overhead (cioè, CPU più veloce == più veloce deserializzazione).