2012-09-28 87 views
7

Veo muchos ejemplos de importación de un CSV en un db PostgreSQL, pero lo que necesito es una manera eficiente de importar 500,000 CSV en un solo db PostgreSQL. Cada CSV es un poco más de 500 KB (por lo que un gran total de aproximadamente 272 GB de datos).Manera eficiente de importar muchos archivos csv en PostgreSQL db

Los CSV están formateados de forma idéntica y no hay registros duplicados (los datos se generaron programáticamente a partir de una fuente de datos brutos). He estado buscando y continuaré buscando opciones en línea, pero agradecería cualquier dirección para que esto se haga de la manera más eficiente posible. Tengo cierta experiencia con Python, pero profundizaré en cualquier otra solución que me parezca apropiada.

Gracias!

+1

La forma más rápida para importar datos en PostgreSQL es utilizar el comando 'COPY'. –

Respuesta

0

Buena cantidad de información que usted tiene allí. No estoy 100% seguro acerca de Postgre, pero al menos MySQL proporciona algunos comandos SQL para alimentar un csv directamente en una tabla. Esto omite las comprobaciones de inserción y demás, y eso es más que un orden de magnitud más rápido que cualquier operación de inserción normal.

Por lo tanto, probablemente el camino más rápido sea crear una secuencia de comandos python simple, indicando a su servidor postgre qué archivos csv deben devorar con avidez en sus interminables tablas.

7

Si se inicia mediante la lectura de la PostgreSQL guide "Populating a Database" podrás ver varias piezas de consejos:

  1. cargar los datos en una sola transacción.
  2. Use COPY si es posible.
  3. Elimine índices, restricciones de clave externa, etc. antes de cargar los datos y restaurarlos después.

de COPY statement ya es compatible con el formato CSV PostgreSQL:

COPY table (column1, column2, ...) FROM '/path/to/data.csv' WITH (FORMAT CSV) 

por lo que parece como si es el mejor de no usar Python en absoluto, o el uso de Python sólo para generar la secuencia requerida de COPY declaraciones.

+0

Gareth - Supongo por su respuesta que no puede usar comodines en la instrucción Copiar Por lo que puedo decir, necesito algún tipo de método de programación para crear una lista de los archivos y luego emitir comandos de copia individuales. Por favor, corríjame si estoy equivocado. Espero estarlo :). Sería mucho más fácil si pudiera simplemente emitir una declaración de copia con un comodín * .csv – FredG

+0

Seguramente, ¿es fácil generar la secuencia de comandos 'COPY'? Podría hacerlo shell, por ejemplo: '(para FILE en /path/to/*.csv; do echo" COPY table (column1, column2, ...) FROM '$ FILE' WITH (FORMAT CSV); "; done)> import-commands.sql' –

+0

¿No es un poco ineficiente?¿Generar un archivo con 500,000 comandos de copia? – FredG

0

puedo usar PHP y PostgreSQL, y leer el archivo csv con php y montar una cadena con el siguiente formato:

{ {line1 column1, line1 column2, line1 column3} , { line2 column1,line2 column2,line2 column3} } 

Care en una sola transacción pasando el parámetro de cadena a la función PostgreSQL.

Puedo verificar todos los registros, el formato, la cantidad de datos, etc., y obtener un resultado de la importación de 500,000 registros en aproximadamente 3 minutos.

para leer los datos en función de PostgreSQL:

DECLARE 
    d varchar[]; 
BEGIN 

    FOREACH d SLICE 1 IN ARRAY p_dados 
    LOOP 


    INSERT INTO schema.table (
     column1, 
     column2, 
     column3, 
    ) 
    VALUES ( 
     d[1], 
     d[2]::INTEGER, -- explicit conversion to INTEGER 
     d[3]::BIGINT, -- explicit conversion to BIGINT 
    );   
    END LOOP; 

    END; 
Cuestiones relacionadas