2010-09-08 13 views
5

estoy usando la App granel motor cargador (tiempo de ejecución de Python) a las entidades de subida masiva para el almacén de datos. Los datos que estoy cargando se almacenan en un formato propietario, por lo que he implementado por un conector propio (registrado en bulkload_config.py) para convertirlo al diccionario python intermedio.App Engine granel Prestaciones de la pala

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 

Para convertir este diccionario pitón neutra a una entidad del almacén de datos, uso una función de importación mensaje personalizado que he definido en mi YAML.

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

Nota: No estoy usando entity_instance, bulkload_state en mi función feature_post_import. Solo estoy creando nuevas entidades de almacenamiento de datos (basadas en mi input_dict) y las estoy devolviendo.

Ahora, todo funciona muy bien. Sin embargo, el proceso de carga masiva de datos parece tomar demasiado tiempo. Por ej. un GB (~ 1,000,000 de entidades) de datos toma ~ 20 horas. ¿Cómo puedo mejorar el rendimiento del proceso de carga masiva? ¿Me estoy perdiendo de algo?

Algunos de los parámetros que uso con appcfg.py son (10 hilos con un tamaño de lote de 10 entidades por hilo).

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

Actualización: para probar el rendimiento del proceso de carga a granel, cargué entities de un 'Test' Kind. A pesar de que este entity tiene una muy simple FloatProperty, todavía me tomó la misma cantidad de tiempo para la carga a granel los entities.

Todavía voy a intentar variar los parámetros del cargador a granel, rps_limit, bandwidth_limit y http_limit, para ver si puedo obtener más rendimiento.

+0

Si hay algo confuso sobre la cuestión, o algo que tengo que añadir a continuación, hágamelo saber. – Rahul

Respuesta

4

Hay un parámetro llamado rps_limit que determina el número de entidades para cargar por segundo. Este fue el principal cuello de botella. El valor predeterminado para esto es 20.

También aumente el bandwidth_limit a algo razonable.

Aumenté rps_limit a 500 y todo mejoró. Logré 5.5 - 6 segundos por 1000 entidades, lo cual es una mejora importante de 50 segundos por cada 1000 entidades.