我有一个7GB的GeoJson文件,我想将其加载到PostGIS数据库中。我曾尝试使用ogr2ogr,但由于文件太大而无法加载到内存中然后进行处理,因此失败了。
是否有其他替代方法可以将此geojson文件加载到PostGIS中?
我收到的ogr2ogr错误是:
错误2:CPLMalloc():内存不足,分配-611145182字节。该应用程序已请求运行时以一种异常方式终止它。请与应用程序的支持团队联系以获取更多信息。
我有一个7GB的GeoJson文件,我想将其加载到PostGIS数据库中。我曾尝试使用ogr2ogr,但由于文件太大而无法加载到内存中然后进行处理,因此失败了。
是否有其他替代方法可以将此geojson文件加载到PostGIS中?
我收到的ogr2ogr错误是:
错误2:CPLMalloc():内存不足,分配-611145182字节。该应用程序已请求运行时以一种异常方式终止它。请与应用程序的支持团队联系以获取更多信息。
Answers:
您发送的示例表明,可以使用记事本++之类的编辑器手动分割文件
1)为每个块创建一个标题:
{"type":"FeatureCollection","features":[
2)标头后放置许多功能:
{"geometry": {"type": "Point", "coordinates": [-103.422819, 20.686477]}, "type": "Feature", "id": "SG_3TspYXmaZcMIB8GxzXcayF_20.686477_-103.422819@1308163237", "properties": {"website": "http://www.buongiorno.com", "city": "M\u00e9xico D.F. ", "name": "Buongiorno", "tags": ["mobile", "vas", "community", "social-networking", "connected-devices", "android", "tablets", "smartphones"], "country": "MX", "classifiers": [{"category": "Professional", "type": "Services", "subcategory": "Computer Services"}], "href": "http://api.simplegeo.com/1.0/features/SG_3TspYXmaZcMIB8GxzXcayF_20.686477_-103.422819@1308163237.json", "address": "Le\u00f3n Tolstoi #18 PH Col. Anzures", "owner": "simplegeo", "postcode": "11590"}},
3)完成以下步骤:
]}
编辑-这是python代码,它将文件定义为定义的大小(按功能数量):
import sys
class JsonFile(object):
def __init__(self,file):
self.file = open(file, 'r')
def split(self,csize):
header=self.file.readline()
number=0
while True:
output=open("chunk %s.geojson" %(number),'w')
output.write(header)
number+=1
feature=self.file.readline()
if feature==']}':
break
else:
for i in range(csize):
output.write(feature)
feature=self.file.readline()
if feature==']}':
output.write("]}")
output.close()
sys.exit("Done!")
output.write("]}")
output.close()
if __name__=="__main__":
myfile = JsonFile('places_mx.geojson')
myfile.split(2000) #size of the chunks.
不幸的是,JSON非常类似于XML,非常不适合流处理,因此几乎所有实现都要求将整个数据集都加载到内存中。尽管对于您的小型集合来说这是可以的,但除了将数据集分成较小的可管理块之外,没有其他选择。
这是对Pablo解决方案的改进,它不需要您实际打开文件并将其加载到编辑器中并手动拆分,而是尝试使整个过程尽可能自动化。
将json文件复制到Unix主机(linux,osx)上或在Windows上安装cygwin工具。然后打开一个shell,并使用vim从文件中删除第一行和最后一行:
$ vim places.json
键入dd删除第一行,然后按SHIFT-G移动文件的末尾,再次键入dd删除最后一行。现在键入:wq保存更改。最多只需要几分钟。
现在,我们将利用unix的强大功能将文件拆分为更易于管理的块。在外壳类型中:
$ split -l 10000 places.json places-chunks-
去喝啤酒。这会将文件拆分为许多较小的文件,每个文件包含10000行。您可以增加行数,只要保持足够小即可使ogr2gr可以管理它。
现在,我们将对每个文件添加首尾:
$ echo '{"type":"FeatureCollection","features":[' > head
$ echo ']}' > tail
$ for f in places-chunks-* ; do cat head $f tail > $f.json && rm -f $f ; done
快去抢。前两个命令仅创建具有正确内容的页眉和页脚文件(为方便起见),最后一个命令将在上面拆分的每个块中添加页眉和页脚,并删除无页眉/无页脚的块(以节省空间) )。
在这一点上,您可以希望使用ogr2ogr处理许多place-chunks-*。json文件:
$ for f in places-chunks-*.json ; do ogr2ogr -your-options-here $f ; done
sed -i "1d" places.json
删除前4行: sed -i "1,4d" places.json
删除最后4行: head -n -4 places.json > places2.json
可以使用FME Desktop加载数据。很简单
用Python编写一个懒惰的读取器和写入器应该很简单,该读取器和写入器可以将您的geojson文件转换为小得多的shapefile格式,或者直接转换为SQL,而无需在内存中完成所有操作。转换后,本地PostGIS工具可以导入大型数据集。OGR中对geojson的支持相对较新,并且没有用于处理大型文件的任何标志。
如果您能以某种方式共享文件的可管理部分,那么我可以为您提供帮助。
GDAL 2.3.0 https://trac.osgeo.org/gdal/wiki/Release/2.3.0-News中对此进行了改进,现在在读取大型GeoJSON文件时,其内存效率更高。