使用osm2pgsql时,方法的导入速度非常慢。我需要小费如何加快导入速度。
服务器设置
6 Core Xenon
20 GB Ram
1400 GB SAS
我的SAS驱动器的速度测试
hdparm -tT /dev/sda2
/dev/sda2:
Timing cached reads: 7492.82 MB/sec
SG_IO: 240.88 MB/sec
导入脚本
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控制台输出
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
中的优化工具链希望,还有一些其他选项可以调整。
答案 0 :(得分:0)
直接回答:尝试将-C降低到4096左右,您可能没有足够的内存来存储postgres和osm2pgsql进程。另外,尝试使用“ --flat-nodes /tmp/mycache.bin”来加快直接本地存储而不是使用数据库的处理速度。也可以尝试--unlogged,但请阅读文档,以确保您对后果没有问题。
其他想法,如果您处于云环境中,请使用性能更高的计算机(例如aws r5a.2xlarge)进行加载,然后下降到t3.medium附近以提供内容。在云中,您可以将计算机专用于不同的目的,甚至可以使用Fargate之类的容器主机进行处理,并且仅在运行负载或更新时付费。
我在64G内存计算机上的当前配置:
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
增加到具有7.2T nvme ssd驱动器和12cpu的96G内存的计算机
r5a.2xlarge
其他想法: 当然可以调整这些设置以获得更好的性能,但是对于快速设置来说,只要加载后在正常操作中不要将机器保持这些大小,这似乎效果很好并且很便宜。上面的架构仅需$ 8即可加载北美,因此不值得为进一步优化而费力。
如果在本地运行postgres,下一步将提高速度:
有兴趣的人的RDS命令
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;