Ich versuche, mit meiner Kompilierung von GDAL 1.9.2 viele ASPRS-LAS-Punktdateien in eine ESRI-Datei-Geodatabase zu schreiben. Der FileGDB-Treiber für GDAL / OGR scheint beim Schreiben großer Dateien unglaublich langsam zu sein. Das Schreiben von nur 8 Millionen Punktdatensätzen dauert bis zu 45 Minuten. Die Schreibgeschwindigkeiten von FileGDB mit GDAL auf einem SATA3-Laufwerk liegen in der Größenordnung von 200 Kilobyte pro Sekunde, was unannehmbar langsam ist, wenn ich versuche, Terrabyte an Daten zu konvertieren.
In der FileGDB-Dokumentation habe ich festgestellt, dass das Definieren des Makros FGDB_BULK_LOAD die Leistung für große Datenmengen verbessern sollte. Ich habe jedoch keine Änderung der Leistung festgestellt, als ich unmittelbar nach der FGDB_LIB eine Zeile in die Datei "nmake.opt" mit dem Text "FGDB_BULK_LOAD = YES" geschrieben habe Linie.
Zugegeben, eine FileGDB ist nicht der ideale Weg, um Milliarden von Punktdatensätzen zu speichern, aber das ist ein Problem für ein anderes Mal. Habe ich die Funktion FGDB_BULK_LOAD richtig verwendet? Soll das in meinem Quellcode sein, nicht im GDAL-Build?
Vielen Dank.
UPDATE: Richtige Verwendung: (Im Chat beantwortet)
Die FGDB_BULK_LOAD
Einstellung wird ordnungsgemäß als Umgebungsvariable für den GDAL / OGR-Prozess gespeichert. Dies wird in der Befehlszeile während des von Ragi gezeigten ogr exe-Aufrufs eingestellt. Mit den GDAL-Funktionen kann es programmgesteuert für den gesamten Prozess mit eingestellt werden
CPLSetConfigOption("FGDB_BULK_LOAD", "YES");
oder nur für den aktuellen Thread mit
CPLSetThreadLocalConfigOption("FGDB_BULK_LOAD", "YES");
FGDB_BULK_LOAD
muss vor dem Anruf eingestellt werden FGdbDataSource::CreateLayer()
. Es war unklar, ob OGRCleanupAll()
diese Variable deaktiviert wurde, aber es ist sicher, mehrmals aufzurufen, um sicherzugehen.
Durch die Verwendung dieser Option wurde die Leistung beim Schreiben von Millionen bis zig Millionen Punkten um das 5,5-fache gesteigert.