Desempenho lento do FileGDB no GDAL

8

Estou tentando gravar muitos arquivos de ponto ASPRS LAS em um geodatabase de arquivo ESRI usando minha compilação do GDAL 1.9.2. O driver FileGDB para GDAL / OGR parece incrivelmente lento ao gravar arquivos grandes, levando até 45 minutos para gravar apenas 8 milhões de registros de pontos. As velocidades de gravação do FileGDB usando GDAL em uma unidade SATA3 são da ordem de 200 kilobytes por segundo, o que é inaceitavelmente lento quando estou tentando converter terrabytes de dados.

Notei na documentação do FileGDB que definir a macro FGDB_BULK_LOAD deve melhorar o desempenho de grandes conjuntos de dados, mas não notei nenhuma alteração no desempenho quando escrevi uma linha no arquivo "nmake.opt" com o texto "FGDB_BULK_LOAD = YES" imediatamente após o FGDB_LIB linha.

É certo que um FileGDB não é a maneira ideal de armazenar bilhões de registros de dados de pontos, mas isso é uma queixa por outro tempo. Eu usei corretamente o recurso FGDB_BULK_LOAD? Isso deveria estar no meu código-fonte, não na versão GDAL?

Obrigado.

ATUALIZAÇÃO: Uso adequado: (Respondido no chat)

A FGDB_BULK_LOADconfiguração é armazenada corretamente como uma variável de ambiente para o processo GDAL / OGR. Isso é definido na linha de comando durante a chamada ogr exe, como mostrado por Ragi. Usando as funções GDAL, pode ser definido programaticamente para todo o processo com

 CPLSetConfigOption("FGDB_BULK_LOAD", "YES");

ou apenas para o segmento atual usando

 CPLSetThreadLocalConfigOption("FGDB_BULK_LOAD", "YES");

FGDB_BULK_LOADdeve ser definido antes da chamada FGdbDataSource::CreateLayer(). Não ficou claro se OGRCleanupAll()essa variável foi desmarcada, mas é seguro chamar várias vezes para ter certeza.

O uso dessa opção aumentou o desempenho para ser cerca de 5,5x mais rápido para gravar milhões a dezenas de milhões de pontos.

Phlucious
fonte

Respostas:

9

FGDB_BULK_LOAD não é uma configuração de compilação, é uma opção de configuração para as ferramentas de linha de comando (também pode ser feita programaticamente).

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

Criaria um filegdb e carregaria os dados vetoriais KML nele. Deixe-me saber se o seu desempenho ainda é ruim. A propósito, em qual plataforma você está?

Atualizar:

Apenas para resumir o que foi discutido no chat e no IRC:

Para acesso 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);

deve ser o equivalente.

Ragi Yaser Burhum
fonte
Obrigado pela sua resposta. Estou no Windows 7x64, codificando em C ++ no Qt Creator e compilando com o MSVC2010. Não sabia que era uma opção de linha de comando. É possível aproveitar essa melhoria de desempenho ao codificar a partir da biblioteca?
Phlucious
Queixa geral do GDAL / OGR: a maioria das instruções de configuração e uso nas páginas dos drivers são direcionadas apenas ao uso da linha de comando, enquanto o meu caso de uso requer a integração da biblioteca GDAL / OGR ao meu código. Existe um recurso de documento direcionado ao desenvolvedor que eu não conheça?
Phlucious
@Phlucious Há a seção Recursos aqui: gdal.org/ogr, que possui muita documentação para desenvolvedores. No final, a melhor documentação é o próprio código fonte. O código-fonte inteiro do driver FileGDB tem apenas 7 arquivos e está disponível aqui github.com/OSGeo/gdal/tree/trunk/gdal/ogr/ogrsf_frmts/filegdb . De fato, se você quiser ver como a bandeira é usada, pode procurar aqui: github.com/OSGeo/gdal/blob/trunk/gdal/ogr/ogrsf_frmts/filegdb/…
Ragi Yaser Burhum em
A maneira como a configuração é passada é simplesmente uma matriz de seqüências de caracteres. Você pode descobrir isso olhando aqui Ele é passada como um array de strings github.com/OSGeo/gdal/blob/trunk/gdal/ogr/ogrsf_frmts/filegdb/...
Ragi Yaser Burhum
1
O que você diz faz sentido. No meu aplicativo, com classes de recursos da ordem de milhões a dezenas de milhões de pontos, vi um aumento de desempenho de 5,5 a 6,0 vezes. Bastante impressionante! Também aprendi que você pode ter vários threads gravando no mesmo FileGDB, desde que gravem em itens diferentes, o que aumenta ainda mais o desempenho.
Phlucious