首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >osm2pgsql导入速度缓慢

osm2pgsql导入速度缓慢
EN

Stack Overflow用户
提问于 2019-06-09 19:05:22
回答 1查看 1.9K关注 0票数 0

osm2pgsql的导入速度非常慢。我需要提示如何加快进口速度。

服务器设置

代码语言:javascript
复制
6 Core Xenon
20 GB Ram
1400 GB SAS

我的SAS-驱动器的速度测试

代码语言:javascript
复制
hdparm -tT /dev/sda2
/dev/sda2:
 Timing cached reads:   7492.82 MB/sec
SG_IO: 240.88 MB/sec

导入脚本

代码语言:javascript
复制
osm2pgsql --slim -r pbf -S mapfeatures_export.style -C 14000 -l --number-processes 5 -U osmdata --create --multi-geometry -d osmdatabase planet-190603.osm.pbf 

运行期间osm2pgsql控制台输出

代码语言:javascript
复制
osm2pgsql version 0.96.0 (64 bit id space)

Using built-in tag processing pipeline
Using projection SRS 4326 (Latlong)
Setting up table: planet_osm_point
Setting up table: planet_osm_line
Setting up table: planet_osm_polygon
Setting up table: planet_osm_roads
Allocating memory for dense node cache
Allocating dense node cache in one big chunk
Allocating memory for sparse node cache
Sharing dense sparse
Node-cache: cache=14000MB, maxblocks=224000*65536, allocation method=11
Mid: pgsql, cache=14000
Setting up table: planet_osm_nodes
Setting up table: planet_osm_ways
Setting up table: planet_osm_rels

Reading in file: /home/osmdata/planet-190603.osm.pbf
Using PBF parser.
Processing: Node(5234820k 342.0k/s) Way(15203k 0.20k/s) Relation(0 0.00/s)

我测试了一个SSD设置,它的导入速度是50k/s,但是它太贵了。

我遵循了https://www.geofabrik.de/media/2012-09-08-osm2pgsql-performance.pdf的优化工具链

希望,还有一些额外的选择可以调整。

EN

回答 1

Stack Overflow用户

发布于 2019-11-10 23:40:31

直接回答:尝试将您的-C降到4096左右,您可能没有足够的内存来处理postgres和osm2pgsql进程。另外,尝试‘-平面节点/tmp/mycache.bin’来加快直接本地存储的处理速度,而不是使用数据库。也可以尝试

如果您是在云环境中,可以使用更高的性能机器来加载,比如AWSr5a.2xLarge,然后下降到更接近t3.media的内容。在云中,您可以将机器专用于不同的目的,甚至可以使用容器主机(如fargate )进行处理,并且只在运行加载或更新时支付费用。

我在64G内存机器上的当前配置:

代码语言:javascript
复制
  osm2pgsql --create --slim --flat-nodes /tmp/osm-cache.bin -C 18000 --database postgres --unlogged -H osmsource.cu932j20s2i5e.us-east-1.rds.amazonaws.com -U gisloader -W /osmdata/north-america-latest.osm.pbf
  • 使用默认-C (与-C 800相同)加载北美:
    • 节点(1137243k 1202.2k/s)路径(92064k 70.22k/s)关系(291320 55.28/s) (停止)

  • 使用-C 11000:
    • 节点(1137243k 3203.5k/s)路径(92064k 70.28k/s)关系(47320 80.87/s) (停止,关系#下降)
    • pct内存为27%

  • 拥有--编号-进程5 -C 9000
    • 处理:节点(1137243k 3203.5k/s)方式(92064k 69.96k/s)关系(226630 54.97/s) (停止)

  • 仅使用-C 19000 (监视线程,默认情况下似乎使用n-2线程) 。
    • 节点(1137243k 3176.7k/s)取消类似性能

  • 增加到7.2T nvme ssd驱动器和12 96G的96g内存的机器
代码语言:javascript
复制
- Node(1137243k 6729.3k/s) Way(92064k 90.17k/s) Relation(957280 69.26/s)  parse time: 15012s

  • r5a.2xlarge
  • Db.r5.大型postgres 11.5,其余为缺省值(rds实例可能根据您的需要更小,但在90%的rds cpu和负载期间内存利用率相当高的服务器上平衡,只使用大约10%的cpu)。您需要运行rds中的命令来激活扩展(下面列出或搜索aws文档以获取这些命令)。加载之后,您可能会考虑使用一个较小的实例类来控制成本或备份/还原到您自己的机器上,或者只是在rds实例上关闭db。如果你有内存和快速驱动器,从我所读到的地方运行本地会更快。

其他想法:这些设置当然可以被调优以获得更好的性能,但是对于快速设置来说,这似乎执行得很好,而且很便宜,只要您在加载后的正常操作中不离开这些大小的机器。上述结构只需花费8美元来装载北美,因此不值得再进行进一步优化。

下一步,如果在本地运行postgres,则需要提高速度:

  • 更多内存
  • 由于上述机器的速度较高,用于平面节点位置的raid0存储只会推动190 by /s。您需要选择不同类型的机器来使用本地的临时ssd驱动器,但是对于类似于m5ad的设备,您可以将两个本地ssd驱动器连接到一个raid0数组中,这仅取决于您想要用于服务器类和驱动器数量的大小。
  • 更快可能更贵每小时,但如果你能平衡负载速度与成本,你可能会发现,租大型机器的能力可能与时间相平衡,并且两端都有高成本尾随时间,以及一个长的低成本中间区域,那里的成本相似,但时间可以缩短(成本/小时比速度/小时通过成本优化大致平衡)。如果时间允许的话,这将是一项有趣的研究。

https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.html#Appendix.PostgreSQL.CommonDBATasks.PostGIS感兴趣的任何人提供RDS命令

代码语言:javascript
复制
create extension postgis;
create extension fuzzystrmatch;
create extension postgis_tiger_geocoder;
create extension postgis_topology;
create extension hstore;

alter schema tiger owner to rds_superuser ;
alter schema tiger_data owner to rds_superuser ;
alter schema topology owner to rds_superuser ;
\dn
CREATE FUNCTION exec(text) returns text language plpgsql volatile AS $f$ BEGIN EXECUTE $1; RETURN $1; END; $f$;
SELECT exec('ALTER TABLE ' || quote_ident(s.nspname) || '.' || quote_ident(s.relname) || ' OWNER TO rds_superuser;')
  FROM (
SELECT nspname, relname
FROM pg_class c JOIN pg_namespace n ON (c.relnamespace = n.oid)
WHERE nspname in ('tiger','topology') AND
relkind IN ('r','S','v') ORDER BY relkind = 'S')
s;

--TEST--
SET search_path=public,tiger;   

select na.address, na.streetname, na.streettypeabbrev, na.zip
from normalize_address('1 Devonshire Place, Boston, MA 02109') as na;
select topology.createtopology('my_new_topo',26986,0.5);

--setup for loading
create user gisloader with encrypted password 'somepassword';
create schema gis;
grant all privileges on schema gis to gisloader;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56517589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档