5

J'utilise le chargeur en bloc App Engine (Python Runtime) pour charger en bloc des entités dans le magasin de données. Les données que je télécharge sont stockées dans un format propriétaire, donc j'ai implémenté par le propre connecteur (enregistré dans bulkload_config.py) pour le convertir en dictionnaire python intermédiaire.Performances du chargeur en bloc App Engine

import google.appengine.ext.bulkload import connector_interface 
class MyCustomConnector(connector_interface.ConnectorInterface): 
    .... 
    #Overridden method 
    def generate_import_record(self, filename, bulkload_state=None): 
     .... 
     yeild my_custom_dict 

Pour convertir ce dictionnaire neutre python à une entité datastore, j'utilise une fonction de poste personnalisé d'importation que je l'ai défini dans mon YAML.

def feature_post_import(input_dict, entity_instance, bulkload_state): 
    .... 
    return [all_entities_to_put] 

Note: Je n'utilise pas entity_instance, bulkload_state dans ma fonction feature_post_import. Je ne fais que créer de nouvelles entités de magasin de données (basées sur mon input_dict), et les retourner.

Maintenant, tout fonctionne très bien. Cependant, le processus de chargement en masse des données semble prendre trop de temps. Par exemple un Go (~ 1,000,000 entités) de données prend ~ 20 heures. Comment puis-je améliorer les performances du processus de chargement en masse? Est-ce que je manque quelque chose?

Certains des paramètres que j'utilise avec appcfg.py sont (10 threads avec une taille de lot de 10 entités par thread).

associé un poste de groupe Python App Engine Google: http://groups.google.com/group/google-appengine-python/browse_thread/thread/4c8def071a86c840

Mise à jour: Pour tester les performances du processus de chargement en vrac, je chargé entities d'un 'test' Kind. Même si ce entity a un FloatProperty très simple, il m'a fallu le même laps de temps pour charger en vrac ceux entities.

Je vais encore essayer de faire varier les paramètres du chargeur en vrac, rps_limit, bandwidth_limit et http_limit, pour voir si je peux obtenir plus de débit.

+0

S'il y a quelque chose de déroutant à propos de la question, ou quelque chose que j'ai besoin d'ajouter, alors faites le moi savoir. – Rahul

Répondre

4

Il existe un paramètre appelé rps_limit qui détermine le nombre d'entités à télécharger par seconde. C'était le principal goulot d'étranglement. La valeur par défaut pour cela est 20.

Également augmenter le bandwidth_limit à quelque chose de raisonnable. J'ai augmenté rps_limit à 500 et tout s'est amélioré. J'ai atteint 5,5 - 6 secondes pour 1000 entités, ce qui représente une amélioration majeure de 50 secondes pour 1000 entités.