2009-12-22 5 views
8

J'utilise la nouvelle taskqueue expérimentale pour java appengine et j'essaie de créer des tâches qui agrégent les statistiques dans mon datastore. J'essaie de compter le nombre de valeurs UNIQUES dans tous les droits (d'un certain type) dans mon datastore. Plus concrètement, disons que l'entité de type X a un champ A. Je veux compter le nombre de valeurs uniques de A dans mon magasin de données.Quelle peut être la charge utile d'une tâche appengine?

Mon approche actuelle est de créer une tâche qui interroge pour les 10 premières entités de type X, la création d'une table de hachage pour stocker les valeurs uniques de A, en passant alors ce Hashtable à la tâche suivante que la charge utile. Cette prochaine tâche comptera les 10 prochaines entités et ainsi de suite jusqu'à ce que j'ai traversé toutes les entités. Lors de l'exécution de la dernière tâche, je vais compter le nombre de clés dans mon Hashtable (ce qui a été passé d'une tâche à tout le long) pour trouver le nombre total de valeurs uniques de A.

Cela fonctionne pour une petite nombre d'entités dans mon magasin de données. Mais je crains que cette hashtable devienne trop grande une fois que j'ai beaucoup de valeurs uniques. Quelle est la taille maximale autorisée pour la charge utile d'une tâche appengine?

Pouvez-vous suggérer des approches alternatives?

Merci.

Répondre

14

Selon les documents, the maximum task object size is 100K.

+2

+1 pour les informations sur les conditions d'utilisation. – Kredns

+0

la taille de l'objet = taille de la charge utile? – aloo

+4

Vous devez sérialiser votre objet en quelque sorte. C'est la charge utile. Si vous vous attendez à ce qu'il soit supérieur à 10 Ko, vous pouvez utiliser l'astuce de la bibliothèque différée pour sérialiser la clé d'une entité de banque de données contenant les données réelles. –

1

"Pouvez-vous suggérer des approches alternatives?".

Créer une entité pour chaque valeur unique, en construisant une clé basée sur la valeur et en utilisant Model.get_or_insert. Puis Query.count les entités dans des lots de 1000 (ou autant vous pouvez compter avant que votre demande expire - plus de 10), en utilisant les astuces de pagination normales. Vous pouvez utiliser le code similaire à celui indiqué dans les documents pour get_or_insert afin de compter le nombre de transactions. Les transactions App Engine peuvent être exécutées plus d'une fois. Un compte memcached incrémenté dans la transaction ne serait donc pas fiable. Cependant, il se peut qu'il y ait un truc autour de cela, ou vous pouvez garder le compte dans le magasin de données à condition que vous ne fassiez rien de trop désagréable avec les parents de l'entité.

0

Ceci peut être trop tard, mais peut-être qu'il peut être utile. D'abord, chaque fois que vous avez une chance éloignée de vouloir marcher en série à travers un ensemble d'entités, suggérez d'utiliser un champ date_created ou date_modified auto_update qui est indexé. À partir de ce point, vous pouvez créer un modèle avec TextProperty pour stocker votre table de hachage à l'aide de json.dumps(). Tout ce que vous avez à faire est de passer la dernière date traitée et l'identifiant du modèle pour l'entité de la table de hachage. Effectuez une requête avec date_created après la dernière date, json_load() la propriété TextProperty et accumulez les 10 enregistrements suivants. Pourrait être un peu plus sophistiqué (par exemple gérer les collisions créées par date en utilisant les paramètres passés et une approche de requête légèrement différente). Ajoutez un compte à rebours de 1 seconde à la tâche suivante pour éviter tout problème de mise à jour trop rapide de l'entité de la table de hachage. HTH, -stevep

Questions connexes