Spring Boot集成GraphHopper加载法国OSM文件启动耗时优化咨询
优化GraphHopper加载法国OSM文件的启动耗时问题
我正在开发一个集成GraphHopper 8版本的Spring Boot 3.2.1项目,用于汽车路径规划,需要加载整个法国的OSM文件(france-latest.osm.pbf),但应用启动时的初始加载和处理耗时极长,接近一小时,且每次启动都会出现该问题。我的核心需求仅为计算两点间的驾驶距离,希望找到能显著缩短初始加载时间的优化方案,无论是配置修改、OSM数据处理方式变更还是其他策略均可。
环境与配置概述
- 项目框架:Spring Boot 3.2.1
- GraphHopper版本:8
- OSM文件:
france-latest.osm.pbf - 核心需求:仅计算两点间的驾驶距离
当前GraphHopper配置
@Bean public GraphHopper graphHopper() { GraphHopper hopper = new GraphHopper(); hopper.setOSMFile("src/main/resources/france-latest.osm.pbf"); hopper.getRouterConfig().setCalcPoints(false); hopper.getRouterConfig().setInstructionsEnabled(false); hopper.setGraphHopperLocation("target/routing-graph-cache"); hopper.setProfiles(new Profile("car").setVehicle("car").setTurnCosts(false)); hopper.getCHPreparationHandler().setCHProfiles(new CHProfile("car")); hopper.importOrLoad(); return hopper; }
优化建议
1. 持久化缓存目录,避免重复导入
当前配置的缓存目录target/routing-graph-cache属于项目临时目录,构建或清理项目时会被删除,导致每次启动都要重新导入OSM数据。将缓存目录改为项目外的持久化路径:
hopper.setGraphHopperLocation("/opt/graphhopper-cache/france");
首次导入生成缓存后,后续启动仅需加载已生成的缓存文件,速度会大幅提升。
2. 裁剪OSM数据,保留驾驶相关要素
完整的法国OSM文件包含大量非驾驶相关数据(如步行道、自行车道、建筑信息等),可使用osmium-tool或osmosis工具裁剪数据,仅保留汽车可通行的道路:
- 保留
highway标签为motorway、trunk、primary、secondary、tertiary、unclassified、residential的道路 - 过滤掉其他无关标签与要素
裁剪后的文件体积大幅减小,导入和加载时间会明显缩短。
3. 调整CH预处理参数
针对仅计算距离的需求,简化CH(Contraction Hierarchies)预处理配置:
CHProfile chProfile = new CHProfile("car") .setDisablingAllowed(true) // 允许禁用非必要CH优化,减少预处理时间 .setWeighting("fastest"); // 驾驶距离计算使用fastest权重即可 hopper.getCHPreparationHandler().setCHProfiles(chProfile);
4. 增加JVM内存分配
GraphHopper处理大体积OSM文件需要充足内存,内存不足会导致频繁GC,大幅增加处理时间。在项目启动参数中分配更多堆内存:
-Xmx16G -Xms8G
5. 预先生成缓存文件
单独编写工具类提前完成OSM文件导入并生成缓存,项目启动时直接加载缓存而非重新导入:
- 单独运行一次
hopper.importOrLoad()生成缓存 - 项目中将
importOrLoad()替换为load(),确保仅加载缓存
6. 关闭其他非必要配置
在现有基础上,关闭更多与距离计算无关的功能:
hopper.getImportConfig().setWayPointMaxDistance(0); // 关闭路点匹配的额外计算逻辑
内容的提问来源于stack exchange,提问作者dika
相关产品推荐
相关产品推荐

