Mam plik GeoJson o pojemności 7 GB, który chciałbym załadować do bazy danych PostGIS. Próbowałem użyć ogr2ogr, ale to się nie udaje, ponieważ plik jest zbyt duży, aby ogr2ogr mógł załadować do pamięci, a następnie przetworzyć.
Czy istnieją inne alternatywy dla ładowania tego pliku geojson do PostGIS?
Występuje błąd ogr2ogr:
BŁĄD 2: CPLMalloc (): Za mało pamięci przydziela -611145182 bajtów. Ta aplikacja poprosiła środowisko wykonawcze o zakończenie go w nietypowy sposób. Skontaktuj się z zespołem pomocy technicznej aplikacji, aby uzyskać więcej informacji.
Odpowiedzi:
Wysłany przykład pokazuje, że możliwe jest ręczne podzielenie pliku za pomocą edytora, takiego jak notepad ++
1) Dla każdego fragmentu utwórz nagłówek:
2) Po nagłówku umieść wiele funkcji:
3) Zakończ część z:
EDYCJA - Oto kod Pythona, który podzieli plik na części o zdefiniowanym rozmiarze (pod względem liczby funkcji):
źródło
Niestety JSON, podobnie jak XML, źle nadaje się do przetwarzania strumieniowego, więc prawie wszystkie implementacje wymagają załadowania całego zestawu danych do pamięci. Chociaż w twoim przypadku jest to w porządku dla małych zestawów, nie ma innej opcji niż rozbicie zestawu danych na mniejsze, łatwe do zarządzania fragmenty.
Ulepszając rozwiązanie Pablo, oto takie, które nie wymaga faktycznego otwierania i wczytywania pliku do edytora i dzielenia go ręcznie, ale próbuje zautomatyzować w jak największym stopniu cały proces.
Skopiuj plik json na hosta uniksowego (linux, osx) lub zainstaluj narzędzia cygwin w systemie Windows. Następnie otwórz powłokę i użyj vima, aby usunąć pierwszy i ostatni wiersz z pliku:
wpisz dd, aby usunąć pierwszy wiersz, a następnie SHIFT-G, aby przenieść koniec pliku, wpisz dd ponownie, aby usunąć ostatni wiersz. Teraz wpisz : wq, aby zapisać zmiany. Powinno to zająć najwyżej kilka minut.
Teraz wykorzystamy czystą moc unixa, aby podzielić plik na łatwiejsze do zarządzania części. W typie powłoki:
Idź napij się piwa. Spowoduje to podzielenie pliku na wiele mniejszych plików, każdy zawierający 10000 linii. Możesz zwiększyć liczbę linii, o ile utrzymujesz ją na tyle małą, aby ogr2gr mógł nią zarządzać.
Teraz przykleimy głowę i ogon do każdego z plików:
Idź złap węża. Pierwsze dwa polecenia po prostu tworzą plik nagłówka i stopki z poprawną zawartością (tak naprawdę dla wygody), a ostatnie dodają nagłówek i stopkę do każdej z części, które podzieliliśmy powyżej i usuwają fragment bez nagłówka / stopki (aby zaoszczędzić miejsce ).
W tym momencie możesz, mam nadzieję, przetworzyć wiele miejsc-fragmentów - plików * .json za pomocą ogr2ogr:
źródło
sed -i "1d" places.json
Usuń pierwsze 4 linie:sed -i "1,4d" places.json
Usuń ostatnie 4 linie:head -n -4 places.json > places2.json
Możliwe jest ładowanie danych za pomocą FME Desktop. To jest bardzo łatwe.
źródło
Powinno być proste napisanie leniwego czytnika i pisarza w Pythonie, który przekonwertowałby twój plik geojson na znacznie mniejszy format pliku shapefile lub bezpośrednio na SQL bez robienia wszystkiego w pamięci. Po konwersji natywne narzędzia PostGIS mogą importować duże zestawy danych. Obsługa geojson w OGR jest stosunkowo nowa i nie ma żadnych flag do obsługi dużych plików.
Jeśli możesz w jakiś sposób udostępnić zarządzalny fragment pliku, mógłbym ci pomóc.
źródło
Ulepszyło się to w GDAL 2.3.0 https://trac.osgeo.org/gdal/wiki/Release/2.3.0-News , teraz jest znacznie bardziej wydajne pod względem pamięci przy odczycie dużych plików GeoJSON.
źródło