Jaki jest najlepszy hack do importowania dużych zbiorów danych do PostGIS?

21

Muszę zaimportować duże pliki Shapefile (> 1 milion rekordów) do PostGIS i zastanawiałem się nad najlepszym sposobem, aby to zrobić.

wprowadź opis zdjęcia tutaj

W moim pytaniu celowo użyłem słowa „hack” zamiast narzędzia, ponieważ myślę, że nie chodzi o to, które narzędzie, ale jaki zestaw kroków lub ustawień konfiguracji użyć. Do tej pory starałem się pluć wtyczki (QGIS), z shp2pgsql postgis narzędzie i gdal ogr2ogr narzędzia. Możesz zobaczyć moją pełną recenzję tego postu. Jak dotąd uważam, że wszystkie z nich naprawdę nie reagują, gdy mamy do czynienia z dużym zbiorem danych. Zastanawiałem się, czy ktoś doświadczył podobnego problemu i czy mógłbyś podzielić się czymś na temat tego podejścia.

dwubajtowy
źródło

Odpowiedzi:

18

Zrobiłem dla ciebie test:

  • PostgreSQL 9.3
  • PostGIS 2.1
  • System Windows 7
  • Procesor i7 3770@3,4 GHz
  • GDAL 2.0-dev 64-bit
  • plik kształtu 1,14 miliona wielokątów, rozmiar pliku 748 MB

Polecenie Ogr2ogr:

ogr2ogr -f PostgreSQL PG: "dbname = 'nazwa bazy danych' host = 'adres' port = '5432' użytkownik = 'x' hasło = 'y'” test.shp --config PG_USE_COPY TAK -nlt MULTIPOLYGON

Całkowity czas: 1 minuta 30 sekund

użytkownik30184
źródło
Dziękuję za odpowiedź! Wydaje się bardzo szybki; Myślę, że to nie zadziałało, ponieważ nie użyłem flagi --config PG_USE_COPY YES; Właśnie udało mi się zaimportować go szybko, używając: psql target-db -U <użytkownik admin> -p <port> -h <nazwa instancji DB> -c "\ copy source-table from 'source-table.csv' with DELIMITER ' , „” (a następnie zrekonstruowanie geometrii), które, jak sądzę, jest podobnym podejściem.
doublebyte
KOPIOWANIE jest szybsze i będzie domyślnym ustawieniem w GDAL 2.0, gdy dane będą zapisywane w nowych tabelach. Gdy używane są wstawki, domyślny rozmiar transakcji (kontrolowany parametrem -gt) wynosił tylko 200 funkcji przed wersją GDAL 1.11, kiedy został zwiększony do 20000 funkcji. Większe transakcje oznaczają mniej transakcji, co może przynieść ogromne przyspieszenie.
user30184,
4
Kluczem jest użycie COPY, a prawdopodobnie otrzymasz jeszcze szybsze tłumaczenie z shp2pgsql i flagą -D. shp2pgsql -D test.shp | psql testdb
Paul Ramsey
Paul, czy shp2pgsql -D jest tym samym co COPY? Nie jest to jasne z dokumentów, które mówią, że używa formatu „zrzutu”, ale nie jestem pewien, co to oznacza nawet dla przesyłania (w przeciwieństwie do operacji tworzenia kopii zapasowej / przywracania). Zauważyłem, że shp2pgsql-gui ma opcję „Ładuj dane za pomocą COPY zamiast INSERT”, ale nie ma opcji „format zrzutu”, więc czy mam rację zakładając, że są takie same?
Lee Hachadoorian,
Tak, -D to samo, co przy użyciu KOPIOWANIA.
Darrell Fuhriman
9

Po sugestii user30184 , Paul Ramsey i moje własne eksperymenty. Postanowiłem odpowiedzieć na to pytanie.

W tym pytaniu nie wspomniałem, że importuję dane na zdalny serwer. (chociaż jest to opisane w poście na blogu, do którego się odnoszę). Operacje takie jak wstawianie przez Internet podlegają opóźnieniu sieci. Być może nie jest bez znaczenia wspomnienie, że ten serwer jest na Amazon RDS , co uniemożliwia mi ssh na maszynie i uruchamianie operacji lokalnie.

Mając to na uwadze, przeprojektowałem swoje podejście, wykorzystując dyrektywę „\ copy”, aby promować zrzut danych do nowej tabeli. Myślę, że ta strategia jest niezbędnym kluczem, do którego również odniesiono się w komentarzach / odpowiedziach na to pytanie.

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

Ta operacja była niesamowicie szybka. Ponieważ zaimportowałem plik csv, miałem całą pracę nad wypełnieniem geometrii, dodaniem indeksu przestrzennego itp. Było to nadal niezwykle szybkie, ponieważ wtedy uruchamiałem zapytania na serwerze .

Postanowiłem przeprowadzić analizę porównawczą również sugestii użytkownika 30184 , Paula Ramseya . Mój plik danych był punktowym plikiem kształtu z 3035369 rekordami i 82 MB.

Podejście ogr2ogr (przy użyciu dyrektywy PG_USE_COPY) zakończyło się w 1:03:00 m, co jest wciąż * znacznie lepsze niż wcześniej.

Metoda shp2pgsql (wykorzystująca dyrektywę -D) zakończyła się tylko 00:01:04 m.

Warto powiedzieć, że ogr2ogr stworzył indeks przestrzenny podczas operacji, a shp2pgsql nie. Przekonałem się, że tworzenie importu po dokonaniu importu jest znacznie bardziej wydajne , niż rozdęcie operacji importowania tego typu żądaniem.

Wniosek jest następujący: shp2pgsql, jeśli jest odpowiednio sparametryzowany, doskonale nadaje się do przeprowadzania dużych importów, a mianowicie tych, które są dostępne w ramach usług Amazon Web Services.

Tabela przestrzenna z ponad 3 milionami rekordów, importowana przy użyciu shp2pgsql

Możesz przeczytać bardziej szczegółowy opis tych wniosków, dotyczący aktualizacji tego postu.

dwubajtowy
źródło
Zanim za bardzo oskarżysz GDAL, zajrzyj do dokumentacji. Ogr2ogr nie jest zaangażowany, jest to raczej sterownik GDAL PostGIS i ma opcję wyłączenia indeksu przestrzennego gdal.org/drv_pg.html . Użycie z ogr2ogr polega na dodaniu -lco SPATIAL_INDEX = NO. GDAL ma również inny sterownik dla PGDump, który może lepiej pasować do twojego przypadku użycia gdal.org/drv_pgdump.html . Być może wspominasz również te rzeczy na swoim blogu.
user30184,
1
Różnica prędkości 1:03:00 i 00:01:04 między ogr2ogr a shp2pgsql jest ogromna. Jestem pewien, że to prawda, ale wyniku nie da się uogólnić. Jeśli przeprowadzasz test z lokalną bazą danych PostGIS, różnica będzie znacznie mniejsza. Twój wynik oznacza, że ​​dla ogr2ogr coś pójdzie nie tak. Z jakiej wersji GDAL korzystałeś? Jeśli jest starszy niż wer. 1.11, czy próbowałeś, zwiększając rozmiar transakcji, dodając coś w rodzaju -gt 60000?
user30184,
1
To nie jest dodatkowe wzdęcie, aby utworzyć w indeksie w imporcie niż to zrobić później. Wydane polecenie jest dokładnie takie samo, a czas zajmuje dokładnie to samo. Ponadto, jeśli chcesz, aby shp2pgsql dodał indeks, wystarczy dodać opcję „-I”.
Darrell Fuhriman,
Dziękuję za komentarze. Moje studium przypadku było importem do Postgres działającego na AWS, więc było dla mnie ważne, aby transakcja przebiegła dobrze przez sieć. Użyłem flagi PG_USE_COPY na ogr2ogr, ale nie próbowałem sterownika PGDump, który na stronie wygląda obiecująco. Moja wersja GDAL to 1.7. Powinienem przeprowadzić analizę porównawczą wszystkiego w równych warunkach (z indeksem lub bez), ale z tego, co mówi mi Daniel, nie jest to problem, ponieważ dość szybko tworzę indeks w bazie danych ...
doublebyte
1
Tak, studia przypadków są w porządku, jeśli zostały napisane, aby czytelnicy nie mieli wrażenia, że ​​wyniki można uogólnić na to, co naprawdę reprezentują. Na przykład dobrze byłoby wspomnieć, że wykonałeś test z 5-letnią wersją GDAL i że od tego czasu może nastąpić, lub nie, pewien rozwój. Twoja wersja z pewnością potrzebuje większej wartości -gt, aby dobrze działać, ale i tak nie ma sensu testować z żadną starszą wersją GDAL niż 1.10.
user30184,