Estoy planeando subir un billón de registros tomados de ~ 750 archivos (cada uno ~ 250MB) a un db usando el ORM de django. Actualmente cada archivo tarda ~ 20min en procesarse, y me preguntaba si hay alguna forma de acelerar este proceso.¿Acelerar la inserción masiva usando el ORM de Django?
que he tomado las siguientes medidas:
- Use @transaction.commit_manually y comprometerse una vez cada 5000 registros
- de depuración SET = False para que Django won't accumulate all the sql commands in memory
- El bucle que se ejecuta a través de los registros en un solo archivo es completamente contenida en una sola función (minimizar los cambios en la pila)
- Se abstuvo de presionar el DB para consultas (se usó un hash local de objetos ya en el db instead of using get_or_create)
- Set force_insert=True in the save() con la esperanza de que va a ahorrar algo de lógica django
- Explicitly set the id con la esperanza de que le ahorrará algo de lógica django
- minimización Código general y optimización
¿Qué más puedo hacer para acelerar las cosas? Éstos son algunos de mis pensamientos:
- utilizan algún tipo de compilador de Python o versión que es más rápido (Psyco?)
- Override the ORM and use SQL directly
- Uso cierto código tercera parte que podría ser mejor (1, 2)
- Beg the django community para crear una función bulk_insert
cualquier indicador con respecto a estos artículos o cualquier otra idea sería bienvenido :)
También puede consultar la herramienta ETL como Pentaho Kettle. – rwilliams
Optimizar las cosas de Python es casi seguro un desperdicio, ya que casi todo su tiempo se gasta en llamadas a bases de datos. Optimización 101, mida para saber a dónde va el tiempo de su programa antes de perder su tiempo tratando de optimizar las cosas equivocadas. La mayor ganancia aquí será mediante el uso de consultas de inserción masiva. – Eloff
Recientemente hice algunos experimentos interesantes con django 1.8.5. Creo que crear un modelo es lo que más consume tiempo, cuando la cantidad de registros llega a 1 millón. Hay muchos controles de django invisibles detrás de la escena. Mi solución es usar SQL sin formato y 'cursor.executemany' en lugar de' bulk_create'. En mi caso, el tiempo se acorta de 13 minutos a 54 segundos. http://stackoverflow.com/questions/32805766/best-practice-of-bulk-create-for-massive-records – stanleyxu2005