2009-12-22 12 views
8

Estoy usando la nueva cola de tareas experimental para Java appengine y estoy intentando crear tareas que agreguen estadísticas en mi almacén de datos. Estoy tratando de contar la cantidad de valores ÚNICOS dentro de todas las entidades (de un cierto tipo) en mi almacén de datos. Más concretamente, digamos que la entidad de tipo X tiene un campo A. Quiero contar el NÚMERO de valores únicos de A en mi almacén de datos.¿Cuán grande puede ser una carga útil de tarea appengine?

Mi enfoque actual es crear una tarea que busque las primeras 10 entidades de tipo X, crear una tabla hash para almacenar los valores únicos de A in y luego pasar esta tabla hash a la siguiente tarea como carga útil. Esta próxima tarea contará las siguientes 10 entidades, y así sucesivamente hasta que haya pasado por todas las entidades. Durante la ejecución de la última tarea, contaré el número de claves en mi hashtable (que se ha pasado de una tarea a otra) para encontrar el número total de valores únicos de A.

Esto funciona para un pequeño número de entidades en mi almacén de datos. Pero me preocupa que este hashtable se vuelva demasiado grande una vez que tenga muchos valores únicos. ¿Cuál es el tamaño máximo permitido para la carga útil de una tarea appengine ?????

¿Puede sugerir algún enfoque alternativo?

Gracias.

Respuesta

14

De acuerdo con los documentos, the maximum task object size is 100K.

+2

+1 para hechos difíciles. – Kredns

+0

¿tiene el tamaño del objeto = tamaño de carga? – aloo

+4

Necesita serializar su objeto de alguna manera. Esa es la carga útil. Si espera que sea más de 10k, puede utilizar el truco diferido de la biblioteca de serializar la clave de una entidad del almacén de datos que contiene los datos reales. –

1

"¿Puede sugerir algún enfoque alternativo?".

Crea una entidad para cada valor único, construyendo una clave basada en el valor y usando Model.get_or_insert. A continuación, Query.count sube las entidades en lotes de 1000 (o la cantidad que cuente antes de que su solicitud caduque, más de 10), utilizando los trucos de búsqueda normales.

O use un código similar al que se da en los documentos para get_or_insert para contar mientras lo hace: las transacciones de App Engine se pueden ejecutar más de una vez, por lo que un recuento de memcached incrementado en la transacción no sería confiable. Sin embargo, puede haber algún truco en eso, o puede mantener el recuento en el almacén de datos siempre que no esté haciendo nada desagradable con los padres de la entidad.

0

Esto puede ser demasiado tarde, pero tal vez pueda ser útil. En primer lugar, cada vez que tenga una remota posibilidad de querer caminar en serie a través de un conjunto de entidades, sugiera usar ya sea un campo date_created o date_modified auto_update indexado. A partir de este punto, puede crear un modelo con TextProperty para almacenar su tabla hash usando json.dumps(). Todo lo que necesita hacer es pasar la última fecha procesada y el ID del modelo para la entidad de la tabla hash. Realice una consulta con date_created más tarde que la última fecha, json_load() TextProperty, y acumule los siguientes 10 registros. Podría ser un poco más sofisticado (por ejemplo, manejar las colisiones creadas por la fecha mediante la utilización de los parámetros aprobados y un enfoque de consulta un poco diferente). Agregue una cuenta regresiva de 1 segundo a la próxima tarea para evitar cualquier problema con la actualización de la entidad de la tabla hash demasiado rápido. HTH, -stevep

Cuestiones relacionadas