Eu tenho um arquivo GeoJson de 7 GB que gostaria de carregar em um banco de dados PostGIS. Eu tentei usar ogr2ogr, mas ele falha porque o arquivo é muito grande para ogr2ogr carregar na memória e depois processar.
Existem outras alternativas para carregar esse arquivo geojson no PostGIS?
O erro ogr2ogr que recebo é:
ERRO 2: CPLMalloc (): falta de memória alocando -611145182 bytes. Este aplicativo solicitou que o tempo de execução o encerrasse de maneira incomum. Entre em contato com a equipe de suporte do aplicativo para obter mais informações.
Respostas:
A amostra que você enviou mostra que pode ser possível dividir manualmente o arquivo usando um editor como o bloco de notas ++
1) Para cada pedaço, crie um cabeçalho:
2) Após o cabeçalho, coloque muitos recursos:
3) Finalize o pedaço com:
EDIT - Aqui está o código python que dividirá o arquivo em partes de tamanho definido (em número de recursos):
fonte
Infelizmente, o JSON é muito parecido com o XML, pouco adequado para o processamento de fluxo, então quase todas as implementações exigem que todo o conjunto de dados seja carregado na memória. Embora isso seja bom para conjuntos pequenos no seu caso, não há outra opção além de dividir o conjunto de dados em blocos menores e gerenciáveis.
Melhorando a solução de Pablo, aqui está uma que não exige que você abra e carregue o arquivo em um editor e divida manualmente, mas tenta automatizar o máximo possível todo o processo.
Copie o arquivo json em um host Unix (linux, osx) ou instale as ferramentas cygwin no Windows. Em seguida, abra um shell e use o vim para remover a primeira e a última linha do arquivo:
digite dd para remover a primeira linha e, em seguida, SHIFT-G para mover o final do arquivo, digite dd novamente para remover a última linha. Agora digite : wq para salvar as alterações. Isso deve demorar apenas alguns minutos.
Agora vamos aproveitar o poder total do unix para dividir o arquivo em partes mais gerenciáveis. No tipo de shell:
Vá pegar uma cerveja. Isso dividirá o arquivo em muitos arquivos menores, cada um contendo 10000 linhas. Você pode aumentar o número de linhas, desde que o mantenha pequeno o suficiente para que o ogr2gr possa gerenciá-lo.
Agora vamos enfiar a cabeça e o rabo em cada um dos arquivos:
Vá pegar uma cobra. Os dois primeiros comandos simplesmente criam um arquivo de cabeçalho e rodapé com o conteúdo correto (apenas por conveniência), enquanto o último adiciona cabeçalho e rodapé a cada um dos blocos divididos acima e remove o bloco sem cabeçalho / rodapé (para economizar espaço) )
Neste ponto, esperamos que você possa processar os muitos arquivos places-chunks - *. Json com ogr2ogr:
fonte
sed -i "1d" places.json
Remova as 4 primeiras linhas:sed -i "1,4d" places.json
Remova as 4 últimas linhas:head -n -4 places.json > places2.json
É possível carregar seus dados com o FME Desktop. É muito fácil.
fonte
Deve ser fácil escrever um leitor e gravador preguiçoso em Python que converta seu arquivo geojson no formato shapefile muito menor ou diretamente no SQL sem fazer tudo na memória. Uma vez convertidas, as ferramentas nativas do PostGIS podem importar grandes conjuntos de dados. O suporte geojson no OGR é relativamente novo e não há sinalizadores para manipular arquivos grandes.
Se você puder compartilhar um pedaço gerenciável do seu arquivo, eu poderia ajudá-lo.
fonte
Isso melhorou no GDAL 2.3.0 https://trac.osgeo.org/gdal/wiki/Release/2.3.0-News agora é muito mais eficiente em termos de memória ao ler grandes arquivos GeoJSON.
fonte