osm2pgsql的导入速度很慢

时间:2019-06-09 19:05:22

标签: osm2pgsql

使用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

中的优化工具链

希望,还有一些其他选项可以调整。

1 个答案:

答案 0 :(得分:0)

直接回答:尝试将-C降低到4096左右,您可能没有足够的内存来存储postgres和osm2​​pgsql进程。另外,尝试使用“ --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
  • 默认使用-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%
  • 使用--number-processes 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驱动器和12cpu的96G内存的计算机

    • 节点(1137243k 6729.3k / s)方式(92064k 90.17k / s)关系(957280 69.26 / s)解析时间:15012s
  • r5a.2xlarge

  • db.r5.large postgres 11.5,其余均为默认值(rds实例可以根据您的需求而变小,但在rds cpu达到90%且服务器在加载期间打开和关闭时具有相当高的内存利用率的情况下,仅使用了10%的CPU)。您需要在rds中运行命令以激活扩展名(在下面列出,或在AWS文档中搜索这些命令)。加载后,您可能会考虑使用较小的实例类来控制成本或将其备份/还原到自己的计算机上,或者仅在数据库位于rds实例上时将其关闭。如果您有内存和快速驱动器,从我阅读的内容中运行本地速度会更快。

其他想法: 当然可以调整这些设置以获得更好的性能,但是对于快速设置来说,只要加载后在正常操作中不要将机器保持这些大小,这似乎效果很好并且很便宜。上面的架构仅需$ 8即可加载北美,因此不值得为进一步优化而费力。

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

  • 更多内存
  • 用于平面节点位置的高速临时驱动器或raid0存储,因为上述计算机仅以约190MB / s的速度运行。您需要选择其他类别的计算机来使用本地临时ssd驱动器,但是使用m5ad之类的东西,您可以将两个本地ssd驱动器绑定到raid0阵列中,这仅受您要在服务器类上花费的数量和数量的限制。驱动器。
  • 更快的速度每小时可能会更昂贵,但是如果您可以平衡负载速度与成本,则可能会发现租用大型计算机的能力可能会与时间保持平衡,并且两端的成本尾随时间而变,并且中间区域成本低廉成本相似但可以缩短时间的地方(通过优化成本可以大致平衡成本/小时与速度/小时的关系)。如果时间允许,这将是一个有趣的研究。
来自https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.html#Appendix.PostgreSQL.CommonDBATasks.PostGIS

有兴趣的人的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;