2010-09-08 13 views
5

Utilizzo il caricatore di massa di App Engine (Python Runtime) per caricare in massa le entità nell'archivio dati. I dati che sto caricando sono archiviati in un formato proprietario, quindi ho implementato tramite il proprio connettore (registrato in bulkload_config.py) per convertirlo nel dizionario intermedio python.Prestazioni del caricatore di massa del motore di app

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 

Per convertire questo dizionario python neutra ad un'entità datastore, io uso una funzione di importazione postale personalizzata che ho definito nel mio YAML.

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

Nota: non sto usando entity_instance, bulkload_state nella mia funzione feature_post_import. Sto solo creando nuove entità di archivio dati (basate sul mio input_dict) e restituendole.

Ora, tutto funziona alla grande. Tuttavia, il processo di caricamento di massa dei dati sembra richiedere troppo tempo. Ad es. un GB (~ 1.000.000 di entità) di dati richiede ~ 20 ore. Come posso migliorare le prestazioni del processo di carico di massa. Mi sto perdendo qualcosa?

Alcuni dei parametri che utilizzo con appcfg.py sono (10 thread con una dimensione batch di 10 entità per thread).

Linked un post gruppo Google App Engine Python: http://groups.google.com/group/google-appengine-python/browse_thread/thread/4c8def071a86c840

Aggiornamento: per testare le prestazioni del processo di caricamento bulk, ho caricato entities di un 'Test' Kind. Anche se questo entity ha un semplice FloatProperty, mi ci è voluto ancora lo stesso tempo per caricare in serie quelli entities.

Ho ancora intenzione di provare a variare i parametri del caricatore di massa, rps_limit, bandwidth_limit e http_limit, per vedere se riesco a ottenere altro throughput.

+0

Se c'è qualcosa di confuso sulla domanda, o qualcosa che devo aggiungere, fammelo sapere. – Rahul

risposta

4

C'è un parametro chiamato rps_limit che determina il numero di entità da caricare al secondo. Questo era il principale collo di bottiglia. Il valore predefinito per questo è 20.

Aumentare anche lo bandwidth_limit in qualcosa di ragionevole.

Ho aumentato rps_limit a 500 e tutto è migliorato. Ho ottenuto 5,5 - 6 secondi per 1000 entità, il che rappresenta un notevole miglioramento da 50 secondi per 1000 entità.