2014-11-29 2 views
2

나는 다음과 같은 명령을 사용하여 아마존 RDS의 PostgreSQL의 DB에 데이터 200M 라인 (3.5GB)의 주위에 대량로드에 노력하고있어 : 내가 얻을 몇 분 후포스트 그레스 복사 쿼리 연결 손실 오류

cat data.csv | psql -h<host>.rds.amazonaws.com -U<user> <db> -c "COPY table FROM STDIN DELIMITER AS ','" 

을 이 오류는 : 나는 모든 200M 대신 첫 번째 100M 라인을 보낼 head -n 100000000 data.csv를 실행하면

connection not open 
connection to server was lost 

다음 명령 대신 성공합니다. 전체 데이터 세트를 사용하여 쿼리가 실패 할 수있는 시간 초과가 있다고 생각합니다. 시간 초과 설정이나 매개 변수를 찾을 수 없었습니다.

전체 데이터 세트에서 대량 삽입이 성공하도록하려면 어떻게해야합니까?

+0

이러한 방법 중 하나를 시도해 보셨습니까? http://stackoverflow.com/questions/3602976/bulk-loading-into-postgresql-from-a-remote-client –

+0

그게 정확히 내가하고있는 일이고, 전체 데이터 세트를위한 시간 초과이다. –

+1

비슷하지만 그렇지는 않다. 정확히 동일합니다. 사용중인 구문을 읽으면 기본적으로 거대한 문자열을 만든 다음 SQL에 연결 한 다음 전체 문자열을 인수로 제공하려고 시도합니다. psql을로드하고'\ copy ... from/path /to/data.csv '...'와 같은 것을 실행하면 파일의 내용이 청크로 스트리밍되는 동안 연결이 살아있을 수 있습니다. 이 질문에 대한 답변은 아직 추측이 아니기 때문에 10M 회선이 작동하는지 (= 인수는 연결 시간 전에 완전히 푸시 되었음) 전체 파일 (= 인수는 계속 업로드 됨)이 아닌 이유에 대한 내 직감이됩니다. –

답변

2

사용중인 구문을 읽었을 때 기본적으로 거대한 문자열을 만든 다음 SQL에 연결 한 다음 전체 문자열을 인수로 제공하려고 시도합니다.

psql을로드하고 \copy ... from '/path/to/data.csv' ...과 같이 실행하면 파일의 콘텐츠가 청크로 스트리밍되는 동안 연결이 유지 될 수 있습니다.

왜 10M 라인이 작동하는지 (= 인수는 연결 시간 전에 완전히 푸시됩니다.) 전체 파일 (= 인수는 여전히 업로드 중)이 아닙니다.

+0

예, COPY 문 대신 \ copy psql 명령을 사용하면 시간 초과 문제가 해결되었습니다. 감사! –