대용량 데이터 세트를 PostGIS로 가져 오기위한 가장 좋은 방법은 무엇입니까?


21

PostGIS에 대용량 Shapefile (> 1 백만 레코드)을 가져와야하며이를 수행하는 가장 좋은 방법이 궁금합니다.

여기에 이미지 설명을 입력하십시오

내 질문에 나는 도구 대신에 "hack"이라는 단어를 사용했다. 왜냐하면 이것이 어떤 도구의 문제가 아니라 어떤 단계 세트 또는 사용할 구성 설정이라고 생각하기 때문이다. 지금까지 SPIT 플러그인 (QGIS), shp2pgsql Postgis 도구 및 GDAL ogr2ogr 도구를 사용해 보았습니다 . 게시물 에서 내 전체 리뷰를 볼 수 있습니다 . 지금까지 큰 데이터 세트를 처리 할 때 모든 것이 실제로 응답하지 않는 것으로 나타났습니다. 누군가 비슷한 문제가 발생했는지, 그리고 접근 방식에 대해 공유 할 수 있는지 궁금합니다.

답변:


18

나는 당신을 위해 시험했다 :

  • PostgreSQL 9.3
  • PostGIS 2.1
  • 윈도우 7
  • i7 3770@3.4GHz 프로세서
  • GDAL 2.0-dev 64 비트
  • 114 만 다각형의 shapefile, 파일 크기 748MB

Ogr2ogr 명령 :

ogr2ogr -f PostgreSQL PG : "dbname = 'databasename'host = 'addr'port = '5432'user = 'x'password = 'y'"test.shp --config PG_USE_COPY 예 -nlt MULTIPOLYGON

총 시간 : 1 분 30 초


답변 주셔서 감사합니다! 정말 빠르다. --config PG_USE_COPY YES 플래그를 사용하지 않았기 때문에 제대로 작동하지 않았을 수도 있습니다. psql target-db -U <admin user> -p <port> -h <DB instance name> -c "\ DELIMITER를 사용하여 'source-table.csv'에서 source-copy를 복사하십시오. , ' "(그리고 지오메트리 재구성)도 비슷한 접근법이라고 생각합니다.
더블 바이트

데이터가 새 테이블에 기록 될 때 COPY가 더 빠르며 GDAL 2.0에서 기본값이됩니다. 삽입을 사용할 때 트랜잭션의 기본 크기 (-gt 매개 변수로 제어)는 GDAL 버전 1.11보다 20000 피처로 증가했을 때 200 피처였습니다. 더 큰 거래는 더 적은 거래를 의미하며 이는 큰 속도 향상을 가져올 수 있습니다.
user30184

4
COPY를 사용하는 것이 중요하며, 아마도 shp2pgsql과 -D 플래그로 더 빠른 번역을 얻을 수있을 것입니다. shp2pgsql -D test.shp | psql testdb
Paul Ramsey

Paul, shp2pgsql -D는 COPY와 동일합니까? 이것이 "덤프"형식을 사용한다고 말하는 문서에서는 명확하지 않지만 업로드 (백업 / 복원이 아닌) 작업의 의미를 잘 모르겠습니다. shp2pgsql-gui에는 "INSERT가 아닌 COPY를 사용하여 데이터로드"옵션이 있지만 "덤프 형식"옵션이 없으므로 동일한 것으로 가정하면 정확합니까?
Lee Hachadoorian

예, -D는 COPY를 사용하는 것과 같습니다.
Darrell Fuhriman

9

의 제안 후 user30184 , 폴 램지 내 자신의 실험. 나는이 질문에 답하기로했다.

이 질문에서 데이터를 원격 서버로 가져오고 있다고 언급하지 못했습니다. (내가 참조하는 블로그 게시물에 설명되어 있지만). 인터넷을 통한 삽입과 같은 작업에는 네트워크 대기 시간이 적용됩니다. 이 서버가 Amazon RDS 에 있다는 것을 언급하는 것은 중요하지 않습니다 . 이로 인해 ssh가 시스템으로 ssh하고 로컬로 작업을 실행할 수 없습니다.

이를 염두에두고 데이터의 덤프를 새 테이블로 승격시키기 위해 "\ copy"지시문을 사용하여 접근 방식을 다시 설계했습니다. 나는이 전략이 필수 열쇠라고 생각하며,이 질문에 대한 의견 / 응답에서도 언급되었습니다.

psql database -U user -h host.eu-west-1.rds.amazonaws.com -c "\copy newt_table from 'data.csv' with DELIMITER ','"

이 작업은 엄청나게 빨랐습니다. CSV를 가져온 후 지오메트리를 채우고 공간 인덱스를 추가하는 등의 모든 작업을 수행 했습니다. 서버 에서 쿼리를 실행했기 때문에 여전히 매우 빠릅니다 .

나는 user30184 , Paul Ramsey 의 제안도 벤치마킹하기로 결정했다 . 내 데이터 파일은 3035369 레코드와 82MB의 포인트 셰이프 파일이었습니다.

ogr2ogr 접근 방식 (PG_USE_COPY 지시문 사용)은 1:03:00 m에 완료되었으며 이는 여전히 이전보다 훨씬 낫습니다.

shp2pgsql 접근법 (-D 지시문 사용)은 00:01:04 m에만 완료되었습니다.

ogr2ogr은 작업 중에 공간 인덱스를 작성했지만 shp2pgsql은 공간 인덱스를 작성하지 않았습니다. 나는 그것이 인덱스를 만드는 데 훨씬 더 효율적임을 발견 한 후 가져 오기를 수행보다는 복부 팽만 이러한 형식의 요청 가져 오기 작업을.

결론은 다음과 같습니다. shp2pgsql은 매개 변수가 올바르게 설정되면 대량의 가져 오기, 즉 Amazon Web Services와 함께 제공되는 가져 오기를 수행하는 데 매우 적합 합니다.

shp2pgsql을 사용하여 가져온 3 백만 개 이상의 레코드가있는 공간 테이블

게시물 의 업데이트에서 이러한 결론에 대한 자세한 설명을 읽을 수 있습니다 .


GDAL을 너무 많이 비난하기 전에 문서를 살펴보십시오. Ogr2ogr은 관련이 없으며 GDAL PostGIS 드라이버이며 공간 인덱스 gdal.org/drv_pg.html 을 비활성화하는 옵션이 있습니다 . ogr2ogr의 사용법은 -lco SPATIAL_INDEX = NO를 추가하는 것입니다. GDAL 또한 사용 사례 더 적합 할 수 PGDump에 대한 다른 드라이버가 gdal.org/drv_pgdump.html을 . 아마도 당신은 또한 당신의 블로그에 이러한 것들을 언급 할 것입니다.
user30184

1
ogr2ogr와 shp2pgsql의 속도 차이 1:03:00과 00:01:04는 엄청납니다. 나는 그것이 진짜라고 확신하지만 결과는 일반화 될 수 없습니다. 로컬 PostGIS 데이터베이스로 테스트하면 차이가 훨씬 줄어 듭니다. 결과는 ogr2ogr에 문제가 있음을 의미합니다. 어떤 GDAL 버전을 사용 했습니까? v1.11보다 오래된 경우 -gt 60000과 같은 것을 추가하여 트랜잭션 크기를 늘리려 고 시도 했습니까?
user30184

1
가져 오기에서 색인에서 작성하는 것이 나중에 수행하는 것보다 더 큰 부담은 아닙니다. 발행 된 명령은 정확히 동일하며 시간이 정확히 동일합니다. 또한 shp2pgsql이 색인을 추가하도록하려면 '-I'옵션 만 추가하면됩니다.
Darrell Fuhriman

귀하의 의견에 감사드립니다. 저의 사례 연구는 AWS에서 실행되는 Postgres로 가져 왔으므로 네트워크에서 트랜잭션이 잘 수행되는 것이 중요했습니다. ogr2ogr에서 PG_USE_COPY 플래그를 사용했지만 맨 페이지에서 유망한 것처럼 보이는 PGDump 드라이버를 시도하지 않았습니다. 내 GDAL 버전은 1.7입니다. 나는 인덱스의 유무에 관계없이 모든 조건을 동일하게 벤치마킹해야하지만, Daniel이 말하는 것은 데이터베이스에서 인덱스를 매우 빨리 생성하기 때문에 문제가되지 않는다 ...
doublebyte

1
그렇습니다. 독자들이 글을 읽은 결과가 실제 표현한 내용으로 일반화 될 수 있다는 느낌을 갖지 않도록 사례 연구를 작성해도 괜찮습니다. 예를 들어, 5 년 된 GDAL 버전으로 테스트를 수행했으며 그 이후로 일부 개발이 발생했을 수도 있고 그렇지 않을 수도 있음을 언급하는 것이 좋습니다. 확실히 당신의 버전은 더 좋은 -gt 값을 필요로하지만 어쨌든 1.10보다 오래된 GDAL 버전으로 테스트하는 것은 의미가 없습니다.
user30184
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.