Rendimiento lento de FileGDB en GDAL

8

Estoy intentando escribir muchos archivos de puntos ASPRS LAS en una geodatabase de archivos ESRI usando mi compilación de GDAL 1.9.2. El controlador FileGDB para GDAL / OGR parece ser increíblemente lento cuando se escriben archivos grandes, y tarda hasta 45 minutos en escribir solo 8 millones de registros de puntos. Las velocidades de escritura de FileGDB usando GDAL en un disco SATA3 son del orden de 200 kilobytes por segundo, lo que es inaceptablemente lento cuando estoy tratando de convertir terrabytes de datos.

Noté en la documentación de FileGDB que definir la macro FGDB_BULK_LOAD debería mejorar el rendimiento para grandes conjuntos de datos, pero no noté ningún cambio en el rendimiento cuando escribí una línea en el archivo "nmake.opt" con el texto "FGDB_BULK_LOAD = YES" inmediatamente después de FGDB_LIB línea.

Es cierto que un FileGDB no es la forma ideal de almacenar miles de millones de registros de datos de puntos, pero eso es una queja para otro momento. ¿He utilizado correctamente la función FGDB_BULK_LOAD? ¿Se supone que está en mi código fuente, no en la compilación GDAL?

Gracias.

ACTUALIZACIÓN: Uso adecuado: (Respondido en el chat)

La FGDB_BULK_LOADconfiguración se almacena correctamente como una variable de entorno para el proceso GDAL / OGR. Esto se establece en la línea de comando durante la llamada ogr exe como se muestra por Ragi. Usando las funciones GDAL, se puede configurar mediante programación para todo el proceso con

 CPLSetConfigOption("FGDB_BULK_LOAD", "YES");

o solo para el hilo actual usando

 CPLSetThreadLocalConfigOption("FGDB_BULK_LOAD", "YES");

FGDB_BULK_LOADdebe establecerse antes de llamar FGdbDataSource::CreateLayer(). No estaba claro si OGRCleanupAll()desarmar esta variable, pero es seguro llamar varias veces para estar seguro.

El uso de esa opción aumentó el rendimiento para ser alrededor de 5.5 veces más rápido para escribir millones a decenas de millones de puntos.

Phlucious
fuente

Respuestas:

9

FGDB_BULK_LOAD no es una configuración de compilación, es una opción de configuración para las herramientas de línea de comandos (también se puede hacer mediante programación).

ogr2ogr --config FGDB_BULK_LOAD YES -f "FileGDB" MyFileGDB.gdb myKML.kml

Crearía un filegdb y cargaría los datos del vector KML. Avísame si tu rendimiento todavía apesta. Por cierto, ¿en qué plataforma estás?

Actualizar:

Solo para resumir lo que se discutió en el chat y el IRC:

Para acceso programático:

 OGRDataSource* datasource = driver->Open("c:/myfilegdb.gdb", TRUE); 
 char* options[] = { "FGDB_BULK_LOAD=YES" , NULL }; 
 OGRLayer newlayer = datasource->CreateLayer("tiny", NULL, wkbPoint25D, options);

Debería ser el equivalente.

Ragi Yaser Burhum
fuente
Gracias por su respuesta. Estoy en Windows 7x64, codificando en C ++ en Qt Creator y compilando con MSVC2010. No me di cuenta de que era una opción de línea de comando. ¿Es posible aprovechar esa mejora de rendimiento al codificar desde la biblioteca?
Phlucious el
Reclamo general de GDAL / OGR: la mayoría de las instrucciones de configuración y uso en las páginas del controlador están dirigidas únicamente al uso de la línea de comandos, mientras que mi caso de uso requiere la integración de la biblioteca GDAL / OGR en mi código. ¿Existe un recurso de documento dirigido por el desarrollador que no conozco?
Phlucious el
@Phlucious Aquí está la sección de Recursos: gdal.org/ogr que tiene mucha documentación para desarrolladores. Al final, la mejor documentación es el código fuente en sí. El código fuente completo para el controlador FileGDB son solo 7 archivos, y está disponible aquí github.com/OSGeo/gdal/tree/trunk/gdal/ogr/ogrsf_frmts/filegdb . De hecho, si quieres ver cómo se usa la bandera, puedes mirar aquí: github.com/OSGeo/gdal/blob/trunk/gdal/ogr/ogrsf_frmts/filegdb/…
Ragi Yaser Burhum el
La forma en que se pasa la configuración es simplemente una serie de cadenas. Puede averiguarlo mirando aquí. Se pasa como una serie de cadenas github.com/OSGeo/gdal/blob/trunk/gdal/ogr/ogrsf_frmts/filegdb/…
Ragi Yaser Burhum
1
Lo que usted dice tiene sentido. En mi aplicación, con clases de entidad del orden de millones a decenas de millones de puntos, vi un aumento de rendimiento de 5.5 a 6.0 veces. ¡Muy impresionante! También aprendí que puedes tener múltiples hilos escribiendo en el mismo FileGDB siempre que escriban en diferentes elementos, lo que aumenta aún más el rendimiento.
Phlucious