将大型数据集导入PostGIS的最佳方法是什么?


21

我必须将大型Shapefile文件(> 100万条记录)导入PostGIS,而且我一直在想最好的方法。

在此处输入图片说明

在我的问题中,我故意使用“ hack”一词,而不是工具,因为我认为这与哪个工具无关,而与要使用的步骤集或配置设置有关。到目前为止,我已经尝试了SPIT插件(QGIS),shp2pgsql Postgis工具和GDAL ogr2ogr工具。您可以在这篇文章中查看我的完整评论。到目前为止,当处理大型数据集时,我发现它们都真的没有响应。我想知道是否有人遇到过类似的问题,以及您是否可以分享有关此方法的一些信息。

Answers:


18

我为您做了一个测试:

  • PostgreSQL 9.3
  • PostGIS 2.1
  • Windows 7的
  • i7 3770@3.4 GHz处理器
  • GDAL 2.0开发64位
  • 114万个多边形的shapefile,文件大小748 MB

Ogr2ogr命令:

ogr2ogr -f PostgreSQL PG:“ dbname ='数据库名称'host ='addr'端口='5432'用户='x'密码='y'” test.shp --config PG_USE_COPY是-nlt MULTIPOLYGON

总时间:1分钟30秒


感谢您的回答!好像真的很快。我认为这可能对我不起作用,因为我没有使用--config PG_USE_COPY YES标志;我只是设法使用以下命令快速导入它:psql target-db -U <管理员用户> -p <端口> -h <数据库实例名称> -c“ \从'source-table.csv'复制源表,并使用DELIMITER' ,”(然后重建几何图形),我想这是一种类似的方法。
2014年

COPY更快,在将数据写入新表时将成为GDAL 2.0中的默认值。使用插入时,默认事务大小(由-gt参数控制)在GDAL 1.11版增加到20000个功能之前只有200个功能。更大的交易意味着更少的交易,并且可以产生巨大的加速。
user30184 2014年

4
使用COPY是关键,使用shp2pgsql和-D标志可能会得到更快的翻译。shp2pgsql -D test.shp | psql testdb
Paul Ramsey

保罗,shp2pgsql -D与COPY一样吗?从文档中尚不清楚这是使用“转储”格式,但我不确定这对上传(而不是备份/还原)操作意味着什么。我注意到shp2pgsql-gui有一个选项“使用COPY而不是INSERT加载数据”,但是没有“转储格式”选项,所以我假设这些相同是正确的吗?
Lee Hachadoorian 2014年

是的,-D与使用COPY相同。
2014年

9

经过user30184的建议,Paul Ramsey和我自己的实验。我决定回答这个问题。

我没有在这个问题中提到我正在将数据导入到远程服务器。(尽管在我引用的博客文章中对此进行了描述)。互联网上的插入等操作会受到网络延迟的影响。提到该服务器位于Amazon RDS上可能并不无关紧要,这可以防止我SSH连接到计算机并在本地运行操作。

考虑到这一点,我重新设计了方法,使用“ \ copy”指令将数据转储到新表中。我认为该策略是必不可少的关键,对此问题的评论/答案也提到了这一策略。

psql database -U user -h host.eu-west-1.rds.amazonaws.com -c "\copy newt_table from 'data.csv' with DELIMITER ','"

此操作非常快。自从导入csv以来,我便完成了填充几何体,添加空间索引等所有工作。由于我当时正在服务器上运行查询,因此它仍然非常快。

我决定也参考user30184的建议,Paul Ramsey。我的数据文件是一个点shapefile,具有3035369条记录和82 MB。

ogr2ogr方法(使用PG_USE_COPY指令)在1:03:00 m结束,仍然比以前好得多。

shp2pgsql方法(使用-D指令)仅在00:01:04 m内完成。

值得一提的是,ogr2ogr在操作期间创建了空间索引,而shp2pgsql却没有。我发现,执行导入创建索引要比用这种类型的请求膨胀导入操作要高效得多。

结论是:正确设置参数后,shp2pgsql 非常适合执行大型导入,即要在Amazon Web Services中容纳的导入。

使用shp2pgsql导入的具有超过300万条记录的空间表

您可以在这篇文章的更新中阅读这些结论的更详细的描述。


在您过多地指责GDAL之前,请先阅读一下文档。没有涉及Ogr2ogr,它是GDAL PostGIS驱动程序,并且确实具有禁用空间索引gdal.org/drv_pg.html的选项。ogr2ogr的用法是添加-lco SPATIAL_INDEX = NO。GDAL还有另一个PGDump驱动程序,可能更适合您的用例gdal.org/drv_pgdump.html。也许您还会在博客中提及这些内容。
user30184 2014年

1
ogr2ogr和shp2pgsql之间的速度差异1:03:00和00:01:04很大。我确信这是真实的,但结果无法一概而论。如果使用本地PostGIS数据库进行测试,则差异将小得多。您的结果意味着对ogr2ogr来说,事情变得非常糟糕。您使用了哪个GDAL版本?如果版本早于1.11版,您是否尝试通过添加-gt 60000之类的方法来增加事务的大小?
2014年

1
在导入中的索引中创建没有多余的膨胀,而之后要做。发出的命令完全相同,所需的时间也完全相同。另外,如果您希望shp2pgsql添加索引,则只需添加'-I'选项。
2014年

感谢您的意见。我的案例研究是对运行在AWS上的Postgres的导入,因此对我而言,交易在网络上的良好表现非常重要。我确实在ogr2ogr上使用了PG_USE_COPY标志,但没有尝试使用PGDump驱动程序,该手册在联机帮助页上看起来很有希望。我的GDAL版本是1.7。我应该在条件相等的情况下对所有内容进行基准测试(有或没有索引),但丹尼尔告诉我,这不是问题,因为我在数据库中很快创建了索引...
双字节,

1
是的,案例研究如果是书面的,就可以了,这样读者就不会觉得结果可以推广到他们真正代表的内容。例如,最好提到您使用5年以前的GDAL版本进行了测试,此后可能会或可能不会进行某些开发。您的版本肯定需要更大的-gt值才能正常运行,但无论如何,使用任何低于1.10的GDAL旧版本进行测试都没有太大意义。
user30184 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.