2012-09-28 5 views
7

Vedo un sacco di esempi di importazione di un CSV in un db PostgreSQL, ma quello di cui ho bisogno è un modo efficiente per importare 500.000 CSV in un singolo db PostgreSQL. Ogni CSV è un po 'più di 500 KB (quindi un totale complessivo di circa 272 GB di dati).Modo efficiente per importare un sacco di file CSV in PostgreSQL db

I CSV sono formattati in modo identico e non vi sono record duplicati (i dati sono stati generati in modo programmatico da un'origine dati non elaborata). Ho cercato e continuerò a cercare online le opzioni, ma gradirei qualsiasi direzione su come ottenere questo risultato nel modo più efficiente possibile. Ho una certa esperienza con Python, ma scaverò in qualsiasi altra soluzione che sembra appropriata.

Grazie!

+1

Il modo più veloce per importare i dati in PostgreSQL è quello di usare il comando 'COPY'. –

risposta

0

Bel pezzo di dati che hai lì. Non sono sicuro al 100% di Postgre, ma almeno MySQL fornisce alcuni comandi SQL, per alimentare un CSV direttamente in una tabella. Ciò ignora eventuali controlli di inserimento e così via ed è quindi molto più di un ordine di grandezza più veloce di qualsiasi operazione di inserimento ordinaria.

Quindi il modo più veloce per andare è creare un semplice script python, che dica al tuo server Postgre, quali file CSV in che ordine divorare avidamente nelle sue infinite tabelle.

7

Se si inizia con la lettura della PostgreSQL guide "Populating a Database" vedrete diversi pezzi di consulenza:

  1. caricare i dati in una singola transazione.
  2. Utilizzare COPY se possibile.
  3. Rimuovere gli indici, i vincoli di chiave esterna ecc. Prima di caricare i dati e ripristinarli in seguito.

di COPY statement supporta già il formato CSV PostgreSQL:

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

in modo che appaia come se siete migliore è non usare Python a tutti, o utilizzando Python solo per generare la sequenza richiesta di COPY dichiarazioni.

+0

Gareth - Presumo dalla tua risposta che non è possibile utilizzare i caratteri jolly nell'istruzione Copia? Da quello che posso dire, ho bisogno di un qualche tipo di metodo di programmazione per creare un elenco di file e quindi emettere singoli comandi di copia. Perfavore, correggimi se sbaglio. Spero di essere :). Sarebbe molto più semplice se potessi semplicemente emettere un'istruzione Copy con un carattere jolly * .csv – FredG

+0

Sicuramente generare la sequenza di comandi 'COPY' è facile? Si può fare shell, ad esempio: '(per FILE in /path/to/*.csv; do echo" tabella COPY (colonna1, colonna2, ...) DA '$ FILE' WITH (FORMAT CSV); "; fatto)> import-commands.sql' –

+0

Non è un po 'inefficiente?Generazione di un file con 500.000 comandi di copia? – FredG

0

Io uso PHP e Postgres, e leggere il file csv con PHP e cavalcare una stringa nel seguente formato:

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

cura in una singola transazione passando il parametro stringa alla funzione PostgreSQL.

Posso controllare tutti i record, la formattazione, la quantità di dati, ecc. E ottenere un risultato dell'importazione di 500.000 record in circa 3 minuti.

per leggere i dati in funzione di 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;