10

en mi aplicación realizo algunas operaciones por lotes. lamentablemente esto a veces lleva una eternidad actualizar 400-500 entidades. lo que tengo son todas las claves de entidad, necesito obtenerlas, actualizar una propiedad y guardarlas en el almacén de datos y guardarlas puede tomar hasta 40-50 segundos, que no es lo que estoy buscando.manera más eficiente de obtener, modificar y poner un lote de entidades con ndb

enferma simplificar mi modelo para explicar lo que hago (que es bastante simple de todos modos):

class Entity(ndb.Model): 
    title = ndb.StringProperty() 

keys = [key1, key2, key3, key4, ..., key500] 

entities = ndb.get_multi(keys) 

for e in entities: 
    e.title = 'the new title' 

ndb.put_multi(entities) 

obtener y modificar no toma demasiado tiempo. Intenté get_async en un tasklet y cualquier otra cosa que sea posible, que solo cambia si el get o el forloop demoran más.

pero lo que realmente me molesta es que una opción de venta puede tardar hasta 50 segundos ...

cuál es la forma más eficiente de hacer esta operación (s) en una cantidad decente de tiempo. por supuesto, sé que depende de muchos factores, como la complejidad de la entidad, pero el tiempo que lleva ponerlo realmente supera el límite aceptable para mí.
intenté operaciones asíncronas, tasklets ...

Respuesta

8

Me pregunto si hacer lotes más pequeños de, por ejemplo, 50 o 100 entidades será más rápido. Si haces eso en una tarea vamos a intentar ejecutar esos tasklets al mismo tiempo.

También recomiendo mirar esto con Appstats para ver si eso muestra algo sorprendente.

Por último, suponiendo que esto utiliza el HRD, es posible que haya un límite en el número de grupos de entidades por lote. Este límite predeterminado es muy bajo. Intenta levantarlo.

+1

todas las entidades están en la misma entidad grupo y después de algunas pruebas tengo que decir que el uso de un tasklet para poner las entidades dentro de una tarea diferida por lotes en 50 hace que esta operación sea mucho más rápida. Estoy hablando de 5-10 segundos para la actualización completa que todavía no es lo que tenía en mente, pero mucho mejor que 50 segundos. – aschmid00

+1

Me parece sorprendente, si todos están en el mismo grupo, ¿no tener diferentes lotes te haría llegar al límite de aproximadamente 1 escritura/segundo/grupo? – Alexis

+0

1 lote/segundo suena sobre lo que está recibiendo ... –

0

Parece que MapReduce fue diseñado. Puede hacerlo rápidamente, al obtener y modificar simultáneamente todas las entidades al mismo tiempo, escaladas a través de múltiples instancias del servidor. Sin embargo, su costo aumenta al usar más instancias.

+0

bien, pero esta es una operación bajo demanda. no estoy seguro de si mapreduce es una respuesta a mi pregunta. pero podría estar equivocado – aschmid00

+0

Cuando dice "a pedido", supongo que quiere decir "¿se inició la solicitud HTTP?". Eso no te impide utilizar mapreduce. Sin embargo, verificar los resultados cuando todo termina es un poco más complicado, pero no imposible. – dragonx

+0

sí, están inited solicitud de http. y necesito verificar si la acción/operación tuvo éxito o no. – aschmid00

0

Voy a suponer que tienes el diseño de la entidad que deseas (es decir, no te preguntaré qué estás tratando de hacer y cómo deberías tener una gran entidad en lugar de un montón de pequeños que tienes que actualizar todo el tiempo). Porque eso no sería muy agradable. (=

¿Qué sucede si utiliza la cola de tareas? Puede crear varias tareas y cada tarea puede tomar como parámetros de URL las claves que es responsable de actualizar y la propiedad y el valor que se debe establecer. De esta manera, el trabajo se rompe en trozos manejables y la solicitud del usuario puede regresar inmediatamente mientras el trabajo ocurre en segundo plano? ¿Eso funcionaría?

+0

Creo que * la API de MapReduce básicamente hace esto por usted.Toma su trabajo, lo agrupa en varias tareas y luego emite las tareas en paralelo para que se complete más rápido. – dragonx

+0

el diseño de la entidad está fuera de discusión y sí, intenté establecer tareas, pero luego tendría otros problemas, como no sé si la operación pasó o no, todas las entidades están en el mismo grupo de entidades y hacen la puesta en marcha) en lotes podría causar problemas de contención ... todavía no entiendo cómo una puesta en lote de un grupo de entidades (y no estoy hablando de un millón de entidades) puede tomar casi un minuto. No se trata de tareas en segundo plano, sino de acciones realizadas por un usuario, por lo que necesito saber si las acciones fallan o si tienen éxito de inmediato. – aschmid00

+0

La sugerencia de GVR sobre el uso de AppStats probablemente sea beneficiosa para usted. ¿Cuántos índices se escriben cuando coloca una de sus entidades? ¿Cuántas escrituras DB es? Puede que esté un poco desactualizado, pero consulte este artículo para saber por qué puede tomar un tiempo colocar una de sus entidades: https://developers.google.com/appengine/articles/life_of_write –

Cuestiones relacionadas