2012-09-28 10 views
7

Widzę mnóstwo przykładów importowania pliku CSV do bazy danych PostgreSQL, ale potrzebuję skutecznego sposobu na zaimportowanie 500 000 plików CSV do jednego pliku bazy danych PostgreSQL. Każdy plik CSV ma nieco ponad 500 KB (łącznie ok. 272 ​​GB danych).Efektywny sposób importowania wielu plików CSV do PostgreSQL db

Pliki CSV są identycznie sformatowane i nie ma duplikatów (dane zostały wygenerowane programowo z surowego źródła danych). Szukałem i będę nadal szukał opcji w Internecie, ale byłbym wdzięczny za wszelkie wskazówki, jak to zrobić w najbardziej efektywny sposób. Mam pewne doświadczenie z Pythonem, ale przekopię się do każdego innego rozwiązania, które wydaje się odpowiednie.

Dzięki!

+1

Najszybszy sposób zaimportować dane do PostgreSQL jest użycie komendy 'COPY'. –

Odpowiedz

0

Niezły fragment danych, które tam masz. Nie jestem w 100% pewny co do Postgre, ale przynajmniej MySQL dostarcza kilka poleceń SQL, aby podać csv bezpośrednio do tabeli. Pomija to wszelkie kontrole wkładek i tak dalej, i jest większe niż o rząd wielkości szybsze niż zwykłe operacje wstawiania.

Jedną z najszybszych możliwych dróg jest stworzenie prostego skryptu Pythona, informującego serwer postgre, które pliki csv, w których porządku chciwie pożerają jego niekończące się tabele.

7

Jeśli zacząć od czytania PostgreSQL guide "Populating a Database" zobaczysz kilka rad:

  1. załadować dane w ramach jednej transakcji.
  2. Użyj COPY, jeśli to możliwe.
  3. Usuń indeksy, ograniczenia klucza obcego itp. Przed załadowaniem danych i ich późniejszym przywróceniem.

PostgreSQL COPY statement już obsługuje format csv:

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

więc wygląda na to, czy jesteś najlepszy off nie używając Pythona w ogóle, lub przy użyciu Python tylko do generowania wymaganej sekwencji COPY wypowiedzi.

+0

Gareth - Na podstawie Twojej odpowiedzi zakładam, że nie możesz używać symboli wieloznacznych w instrukcji Kopiuj? Z tego, co wiem, potrzebuję jakiejś metody programowania, aby utworzyć listę plików, a następnie wydać indywidualne polecenia kopiowania. Proszę, popraw mnie jeśli się mylę. Mam nadzieję, że jestem :). Byłoby znacznie łatwiej, gdybym mógł po prostu wydać polecenie Kopiuj z symbolem wieloznacznym * .csv – FredG

+0

Z pewnością generowanie sekwencji komend 'COPY' jest łatwe? Możesz to zrobić z powłoki, na przykład: '(dla FILE w /path /to/*.csv; do echo" COPY table (column1, column2, ...) FROM '$ FILE' WITH (FORMAT CSV); "; done)> import-commands.sql' –

+0

Czy to nie jest trochę nieefektywne?Generowanie pliku z 500 000 poleceń kopiowania? – FredG

0

używam php i postgres i odczytać pliku CSV z php i jeździć ciąg w następującym formacie:

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

starannością w pojedynczej transakcji przekazując parametr ciąg do funkcji PostgreSQL.

Mogę sprawdzić wszystkie rekordy, formatowanie, ilość danych itd. I uzyskać wynik importowania 500 000 rekordów w około 3 minuty.

Aby odczytać dane w funkcji 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; 
Powiązane problemy