Mi empresa obtiene un conjunto de archivos CSV llenos de información de la cuenta bancaria cada mes que necesito importar a una base de datos. Algunos de estos archivos pueden ser bastante grandes. Por ejemplo, uno es de aproximadamente 33 MB y cerca de 65 000 líneas.Mejores prácticas para importar archivos CSV grandes
Ahora tengo una aplicación symfony/Doctrine (PHP) que lee estos archivos CSV y los importa en una base de datos. Mi base de datos tiene aproximadamente 35 tablas diferentes y en el proceso de importación, tomo estas filas, las divido en sus objetos constituyentes y las inserto en la base de datos. Todo funciona muy bien, excepto que es lento (cada fila ocupa aproximadamente un cuarto de segundo) y usa mucha memoria.
El uso de memoria es tan malo que tengo que dividir mis archivos CSV. Un archivo de 20,000 líneas casi no lo logra. Para cuando está cerca del final, tengo un 95% de uso de memoria. Importar ese archivo de 65,000 líneas simplemente no es posible.
He encontrado que Symfony es un marco excepcional para la construcción de aplicaciones y normalmente no consideraría usar nada más, pero en este caso estoy dispuesto a arrojar todas mis ideas preconcebidas por la ventana en nombre del rendimiento. No estoy comprometido con ningún lenguaje específico, DBMS ni nada.
A Stack Overflow no me gustan las preguntas subjetivas, así que trataré de hacerlo lo menos subjetivo posible: para aquellos que no tienen una opinión pero experiencia importando archivos CSV grandes, ¿qué herramientas/¿Tiene prácticas utilizadas en el pasado que han tenido éxito?
Por ejemplo, ¿acabas de usar el ORM/OOP de Django y no has tenido ningún problema? ¿O leíste todo el archivo CSV en la memoria y preparaste unas cuantas declaraciones genéricas INSERT
?
Una vez más, no solo quiero una opinión, sino algo que realmente funcionó para ti en el pasado.
Editar: No solo estoy importando una hoja de cálculo CSV de 85 columnas en una tabla de base de datos de 85 columnas. Estoy normalizando los datos y poniéndolos en docenas de tablas diferentes. Por esta razón, no puedo simplemente usar LOAD DATA INFILE
(estoy usando MySQL) o cualquier otra función de DBMS que solo lea en archivos CSV.
Además, no puedo usar ninguna solución específica de Microsoft.
¿ha realizado algún análisis de rendimiento en el extremo de DB en términos de cómo se crean/comprometen las transacciones? –
No. Toda mi importación está envuelta en una gran transacción. En cuanto a las declaraciones individuales de 'INSERT', no he realizado ningún análisis de rendimiento. Cualquier consejo allí sería apreciado. (Sin embargo, eso solo no resuelve mis problemas de uso de memoria.) –