2012-09-28 12 views
7

Ich sehe viele Beispiele zum Importieren einer CSV in eine PostgreSQL-Datenbank, aber was ich brauche, ist eine effiziente Möglichkeit, 500.000 CSVs in eine einzige PostgreSQL-Datenbank zu importieren. Jede CSV ist etwas über 500KB (also insgesamt ca. 272GB Daten).Effiziente Möglichkeit, viele CSV-Dateien in PostgreSQL db zu importieren

Die CSVs sind identisch formatiert und es gibt keine doppelten Datensätze (die Daten wurden programmatisch aus einer Rohdatenquelle generiert). Ich habe gesucht und werde weiterhin online nach Optionen suchen, aber ich würde mich freuen, wenn es darum geht, dies so effizient wie möglich zu erledigen. Ich habe einige Erfahrungen mit Python, werde aber auf jede andere Lösung eingehen, die angemessen erscheint.

Danke!

+1

Der schnellste Weg, um Daten in PostgreSQL zu importieren ist den 'COPY' Befehl zu verwenden. –

Antwort

0

Nizza Stück Daten, die Sie dort haben. Ich bin nicht 100% ig sicher über Postgre, aber zumindest MySQL bietet einige SQL-Befehle, um eine CSV direkt in eine Tabelle zu füttern. Dies umgeht alle Einfügungsüberprüfungen usw. und ist deshalb um mehr als eine Größenordnung schneller als irgendwelche normalen Einfügeoperationen.

Also der wahrscheinlich schnellste Weg zu gehen ist ein einfaches Python-Skript zu erstellen, sagen Ihrem PostgreServer, welche CSV-Dateien in welcher Reihenfolge hungrig in seine endlosen Tabellen verschlingen.

7

Wenn Sie beginnen, durch das Lesen der PostgreSQL guide "Populating a Database" Sie mehrere Stücke von Beratung sehen werden:

  1. laden die Daten in einer einzigen Transaktion.
  2. Verwenden Sie COPY, wenn überhaupt möglich.
  3. Entfernen Sie Indizes, Fremdschlüsseleinschränkungen usw., bevor Sie die Daten laden und anschließend wiederherstellen.

PostgreSQLs COPY statement bereits unterstützt das CSV-Format:

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

so sieht es aus, als ob Sie am besten sind sie nicht an allen Python, oder mit Python nur die erforderliche Folge von COPY Aussagen zu erzeugen.

+0

Gareth - Ich gehe davon aus, dass Sie in der Copy-Anweisung keine Platzhalter verwenden können. Von dem, was ich sagen kann, brauche ich eine Art von Programmiermethode, um eine Liste der Dateien zu erstellen und dann einzelne Kopierbefehle auszugeben. Bitte korrigieren Sie mich, wenn ich falsch liege. Ich hoffe ich bin :). Es wäre viel einfacher, wenn ich einfach eine Copy-Anweisung mit einem Platzhalter ausgeben könnte. * .csv – FredG

+0

Sicherlich ist das Erzeugen der Sequenz von 'COPY'-Befehlen einfach? Sie könnten es Shell, zum Beispiel tun: '(für Datei in /path/to/*.csv; echo" COPY Tabelle (Spalte1, Spalte2, ...) FROM '$ DATEI' MIT (CSV FORMATIEREN); "; done)> import-commands.sql' –

+0

Ist das nicht ein wenig ineffizient?Erzeugen einer Datei mit 500.000 Kopierbefehlen? – FredG

0

Ich benutze PHP und Postgres, und die CSV-Datei mit php lesen und eine Zeichenfolge im folgende Format reiten:

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

Pflege in einer einzigen Transaktion durch die String-Parameter auf postgresql Funktion übergeben.

Ich kann alle Datensätze, Formatierungen, Datenmenge usw. überprüfen und ein Ergebnis des Importierens von 500.000 Datensätzen in etwa 3 Minuten erhalten.

Um die Daten in postgresql Funktion zu lesen:

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; 
Verwandte Themen