Muszę zaimportować duże pliki Shapefile (> 1 milion rekordów) do PostGIS i zastanawiałem się nad najlepszym sposobem, aby to zrobić.
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.
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.
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.
Możesz przeczytać bardziej szczegółowy opis tych wniosków, dotyczący aktualizacji tego postu.
źródło