2012-09-28 3 views
7

CSV를 PostgreSQL db로 가져 오는 예제가 많이 있지만, 필요한 것은 500,000 개의 CSV를 단일 PostgreSQL db로 가져 오는 효율적인 방법입니다. 각 CSV는 500KB를 약간 넘습니다 (총 약 272GB의 데이터).많은 csv 파일을 PostgreSQL db로 가져 오는 방법

CSV 형식이 동일하며 중복 레코드가 없습니다 (데이터는 원시 데이터 원본에서 프로그래밍 방식으로 생성되었습니다). 나는 검색을 해왔고 옵션을 찾기 위해 계속해서 온라인 검색을 할 것이지만, 가능한 한 가장 효율적인 방법으로이를 수행하는 데 어떤 방향 으로든 감사하겠습니다. 필자는 파이썬에 대한 경험이 있지만 적합한 솔루션을 찾아 낼 것입니다.

감사합니다.

+1

의 PostgreSQL로 데이터를 가져올 수있는 가장 빠른 방법은'COPY' 명령을 사용하는 것입니다. –

답변

0

멋진 데이터 조각이 있습니다. 나는 Postgre에 대해 100 % 확신하지는 않지만 최소한 MySQL은 테이블에 직접 csv를 공급하기 위해 몇 가지 SQL 명령을 제공한다. 이렇게하면 모든 인서트 검사를 건너 뛸 수 있으며 일반적인 인서트 작업보다 훨씬 빠른 속도가 가능합니다.

그래서 가장 빠른 방법은 간단한 파이썬 스크립트를 작성하여 postgre 서버에 어떤 csv 파일을 hungrily endless 테이블에 넣을 지 알려주는 것입니다.

7

당신이이 PostgreSQL guide "Populating a Database" 당신이 조언을 여러 개 볼 수 읽기에 의해 시작하는 경우 : 단일 트랜잭션에서

  1. 로드 데이터를.
  2. 가능한 경우 COPY을 사용하십시오.
  3. 데이터를로드하고 나중에 복원하기 전에 인덱스, 외래 키 제약 조건 등을 제거하십시오.

의 PostgreSQL의 COPY statement 이미 CSV 형식 지원 : 당신이 모든 파이썬을 사용하거나 단지 COPY 문 필요한 시퀀스를 생성하는 파이썬을 사용하지 않는 것이 가장 좋은 선택 인 것처럼

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

그렇게 보이는합니다.

+0

Gareth - 귀하의 답변에서 Copy 문에 와일드 카드를 사용할 수 없다고 가정합니다. 내가 말할 수있는 것부터, 파일 목록을 만들고 개별 Copy 명령을 내리는 프로그래밍 방식이 필요합니다. 내가 틀렸다면 나를 바로 잡아주세요. 나는 희망합니다 :). 와일드 카드 * .csv를 사용하여 Copy 문을 발행 할 수 있다면 훨씬 쉽습니다. – FredG

+0

확실히 'COPY'명령의 시퀀스를 생성하는 것은 쉽습니다. 예를 들어 다음과 같이 쉘을 사용할 수 있습니다 :'(for FILE in /path/to/*.csv; echo "COPY table (column1, column2, ...) FROM '$ FILE'WITH (FORMAT CSV);"; done)> import-commands.sql' –

+0

조금 비효율적이지 않습니까?500,000 개의 복사 명령으로 파일 생성? – FredG

0

나는 PHP와 포스트 그레스를 사용하고, PHP로 CSV 파일을 읽고 다음과 같은 형식으로 문자열을 타고 : 단일 트랜잭션에서

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

케어를 PostgreSQL의 함수에 문자열 매개 변수를 전달하여.

모든 레코드, 형식 및 데이터 양을 확인하고 약 3 분 안에 50 만 레코드를 가져올 수 있습니다.

는 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; 
관련 문제