Ich habe eine 7 GB GeoJson-Datei, die ich in eine PostGIS-Datenbank laden möchte. Ich habe versucht, ogr2ogr zu verwenden, aber es schlägt fehl, weil die Datei zu groß ist, damit ogr2ogr in den Speicher geladen und dann verarbeitet werden kann.
Gibt es andere Alternativen zum Laden dieser Geojson-Datei in PostGIS?
Der Ogr2ogr-Fehler, den ich erhalte, ist:
FEHLER 2: CPLMalloc (): Nicht genügend Speicher für die Zuweisung von -611145182 Byte. Diese Anwendung hat die Runtime aufgefordert, sie auf ungewöhnliche Weise zu beenden. Bitte wenden Sie sich an das Support-Team der Anwendung, um weitere Informationen zu erhalten.
Antworten:
Das von Ihnen gesendete Beispiel zeigt, dass es möglicherweise möglich ist, die Datei mit einem Editor wie notepad ++ manuell zu teilen
1) Erstellen Sie für jeden Block einen Header:
2) Nach dem Header werden viele Features eingefügt:
3) Beenden Sie den Block mit:
BEARBEITEN - Hier ist Python-Code, der die Datei in Stücke definierter Größe (in Anzahl der Features) aufteilt:
quelle
Leider ist JSON, ähnlich wie XML, für die Stream-Verarbeitung schlecht geeignet, sodass bei fast allen Implementierungen das gesamte Dataset in den Arbeitsspeicher geladen werden muss. Dies ist zwar für kleine Mengen in Ihrem Fall in Ordnung, es gibt jedoch keine andere Möglichkeit, als den Datensatz in kleinere, handhabbare Teile aufzuteilen.
In der folgenden Lösung von Pablo müssen Sie die Datei nicht unbedingt öffnen und in einen Editor laden und von Hand teilen, sondern versuchen, den gesamten Prozess so weit wie möglich zu automatisieren.
Kopieren Sie die JSON-Datei auf einen Unix-Host (Linux, OSX) oder installieren Sie die Cygwin-Tools unter Windows. Öffnen Sie dann eine Shell und entfernen Sie mit vim die erste und letzte Zeile aus der Datei:
Geben Sie dd ein , um die erste Zeile zu entfernen, und drücken Sie UMSCHALT-G , um das Ende der Datei zu verschieben. Geben Sie dd erneut ein, um die letzte Zeile zu entfernen. Geben Sie nun Folgendes ein: wq , um die Änderungen zu speichern. Dies sollte höchstens ein paar Minuten dauern.
Jetzt werden wir die Leistungsfähigkeit von Unix nutzen, um die Datei in handlichere Teile aufzuteilen. In der Shell-Typ:
Geh ein Bier holen. Dadurch wird die Datei in viele kleinere Dateien mit jeweils 10000 Zeilen aufgeteilt. Sie können die Anzahl der Zeilen erhöhen, solange Sie sie klein genug halten, damit ogr2gr sie verwalten kann.
Jetzt werden wir Kopf und Schwanz an jede der Dateien kleben:
Geh und schnapp dir eine Schlange. Die ersten beiden Befehle erstellen einfach eine Kopf- und Fußzeilendatei mit dem richtigen Inhalt (nur aus praktischen Gründen), während der letzte Befehl jedem der oben aufgeteilten Blöcke Kopf- und Fußzeilen hinzufügt und den Block ohne Kopf- und Fußzeilen entfernt (um Platz zu sparen) ).
Zu diesem Zeitpunkt können Sie hoffentlich die vielen Places-Chunks - * .json-Dateien mit ogr2ogr verarbeiten:
quelle
sed -i "1d" places.json
Entfernen Sie die ersten 4 Zeilen:sed -i "1,4d" places.json
Entfernen Sie die letzten 4 Zeilen:head -n -4 places.json > places2.json
Es ist möglich, Ihre Daten mit FME Desktop zu laden. Es ist sehr leicht.
quelle
Es sollte einfach sein, in Python einen faulen Leser und Schreiber zu schreiben, der Ihre Geojson-Datei in das viel kleinere Shapefile-Format oder direkt in SQL konvertiert, ohne alles im Speicher zu tun. Nach der Konvertierung können die nativen PostGIS-Tools große Datenmengen importieren. Die Geojson-Unterstützung in OGR ist relativ neu und es gibt keine Flags für den Umgang mit großen Dateien.
Wenn Sie irgendwie einen überschaubaren Teil Ihrer Datei teilen können, könnte ich Ihnen helfen.
quelle
Dies wurde in GDAL 2.3.0 ( https://trac.osgeo.org/gdal/wiki/Release/2.3.0-News) verbessert. Es ist jetzt viel speichereffizienter beim Lesen großer GeoJSON-Dateien.
quelle