Tengo un archivo GeoJson de 7GB que me gustaría cargar en una base de datos PostGIS. He intentado usar ogr2ogr pero falla porque el archivo es demasiado grande para que ogr2ogr se cargue en la memoria y luego se procese.
¿Hay alguna otra alternativa para cargar este archivo geojson en PostGIS?
El error ogr2ogr que obtengo es:
ERROR 2: CPLMalloc (): Sin memoria asignando -611145182 bytes. Esta aplicación ha solicitado el Tiempo de ejecución para terminarlo de una manera inusual. Póngase en contacto con el equipo de soporte de la aplicación para obtener más información.
Respuestas:
La muestra que envió muestra que es posible dividir manualmente el archivo usando un editor como notepad ++
1) Para cada fragmento, crea un encabezado:
2) Después del encabezado coloque muchas características:
3) Termina el trozo con:
EDITAR: aquí hay un código de Python que dividirá el archivo en partes de tamaño definido (en número de características):
fuente
Desafortunadamente, JSON es, al igual que XML, muy adecuado para el procesamiento de flujo, por lo que casi todas las implementaciones requieren que todo el conjunto de datos se cargue en la memoria. Si bien esto está bien para conjuntos pequeños en su caso, no hay otra opción que dividir el conjunto de datos en fragmentos más pequeños y manejables.
Mejorando la solución de Pablo, aquí hay una que no requiere que realmente abra y cargue el archivo en un editor y lo divida a mano, pero intenta automatizar tanto como sea posible todo el proceso.
Copie el archivo json en un host Unix (linux, osx) o instale herramientas cygwin en Windows. Luego abra un shell y use vim para eliminar la primera y la última fila del archivo:
escriba dd para eliminar la primera línea, luego MAYÚS-G para mover el final del archivo, escriba dd nuevamente para eliminar la última línea. Ahora escribe : wq para guardar los cambios. Esto debería tomar solo un par de minutos como máximo.
Ahora aprovecharemos el puro poder de Unix para dividir el archivo en fragmentos más manejables. En el tipo de shell:
Ve a tomar una cerveza. Esto dividirá el archivo en muchos archivos más pequeños, cada uno con 10000 líneas. Puede aumentar el número de líneas, siempre que lo mantenga lo suficientemente pequeño como para que ogr2gr pueda gestionarlo.
Ahora vamos a pegar cabeza y cola a cada uno de los archivos:
Ve a tomar un snak. Los primeros dos comandos simplemente crean un archivo de encabezado y pie de página con el contenido correcto (solo por conveniencia realmente), mientras que el último agregará encabezado y pie de página a cada uno de los fragmentos que dividimos arriba y eliminaremos el fragmento sin encabezado / pie de página (para ahorrar espacio )
En este punto, es de esperar que pueda procesar los muchos trozos de lugares - * .json archivos con ogr2ogr:
fuente
sed -i "1d" places.json
Eliminar las primeras 4 líneas:sed -i "1,4d" places.json
Eliminar las últimas 4 líneas:head -n -4 places.json > places2.json
Es posible cargar sus datos con FME Desktop. Es muy fácil.
fuente
Debería ser sencillo escribir un lector y escritor perezoso en Python que convertiría su archivo geojson al formato de archivo de forma mucho más pequeño o directamente a SQL sin hacerlo todo en la memoria. Una vez convertidas, las herramientas nativas de PostGIS pueden importar grandes conjuntos de datos. El soporte de geojson en OGR es relativamente nuevo y no hay indicadores para manejar archivos grandes.
Si de alguna manera puedes compartir una parte manejable de tu archivo, podría ayudarte.
fuente
Esto ha mejorado en GDAL 2.3.0 https://trac.osgeo.org/gdal/wiki/Release/2.3.0-News ahora es mucho más eficiente en la memoria al leer grandes archivos GeoJSON.
fuente