You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 11:17:32