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

调用r5r::setup_r5出现java.lang.OutOfMemoryError问题求助

问题描述

使用瑞士公共交通2023年GTFS时刻表数据,以及瑞士区域的OSM PBF数据,先在低配置电脑测试,后在配备64GB内存+50GB交换分区的rocker/geospatial Docker环境运行。

运行的R代码如下:

rJava::.jinit()
rJava::.jcall("java.lang.System", "S", "getProperty", "java.version")
# 返回 "11.0.18"
## 重启R会话曾解决过之前的问题 ##
options(java.parameters = "-Xmx50G")
library(r5r)
library(sf)
library(data.table)
library(ggplot2)
r5r_core <- setup_r5(data_path = "/switzerlandR", temp_dir = T, verbose = T)

运行时出现如下日志及错误:

[...]
2023-06-04 21:45:12,333 [main] DEBUG c.c.r.l.LevelOfTrafficStressLabeler - Unable to parse maxspeed tag signals
2023-06-04 21:45:12,333 [main] DEBUG c.c.r.l.LevelOfTrafficStressLabeler - Unable to parse maxspeed tag signals
2023-06-04 21:45:12,574 [main] DEBUG c.c.r.s.StreetLayer - Way has no permissions skipping!
2023-06-04 21:45:12,574 [main] DEBUG c.c.r.s.StreetLayer - Way has no permissions skipping!
2023-06-04 21:45:12,574 [main] DEBUG c.c.r.s.StreetLayer - Way has no permissions skipping!
2023-06-04 21:45:12,574 [main] DEBUG c.c.r.s.StreetLayer - Way has no permissions skipping!
2023-06-04 21:45:12,574 [main] DEBUG c.c.r.s.StreetLayer - Way has no permissions skipping!
2023-06-04 21:45:12,621 [main] DEBUG c.c.r.l.TraversalPermissionLabeler - Unknown access tag:permit
2023-06-04 21:45:12,622 [main] DEBUG c.c.r.l.TraversalPermissionLabeler - Unknown access tag:permit
2023-06-04 21:45:12,674 [main] DEBUG c.c.r.s.StreetLayer - Way has no permissions skipping!
2023-06-04 21:45:12,674 [main] DEBUG c.c.r.s.StreetLayer - Way has no permissions skipping!
Error in setup_r5(data_path = "/switzerlandR", temp_dir = T, verbose = T) : 
  java.lang.OutOfMemoryError: Java heap space

可能原因

  1. Java堆内存参数设置时机错误:options(java.parameters = "-Xmx50G")必须在加载rJava或r5r之前设置,否则参数不会生效。当前代码先初始化了rJava再设置参数,导致JVM启动时未应用50G的堆内存限制。
  2. 数据量过大:全瑞士的OSM和GTFS数据体量较大,R5在加载处理时需要大量内存,即使分配50G堆内存,仍可能不足以支撑全量数据的解析。
  3. Docker容器内存限制:即使宿主机有64GB内存,Docker容器可能被默认限制了内存配额,导致实际可用内存不足。
  4. 版本内存优化问题:旧版本的r5r或其底层R5引擎可能存在内存占用过高或内存泄漏问题。

解决办法

  • 调整Java参数设置顺序:
    完全重启R会话,先设置Java堆内存参数,再加载相关包,示例代码:

    options(java.parameters = "-Xmx50G")
    library(rJava)
    # 可通过以下代码确认参数是否生效
    # rJava::.jcall("java.lang.Runtime", "J", "getRuntime")$maxMemory()/1024/1024/1024
    library(r5r)
    library(sf)
    library(data.table)
    library(ggplot2)
    r5r_core <- setup_r5(data_path = "/switzerlandR", temp_dir = T, verbose = T)
    
  • 裁剪数据体量:

    • 用OSM裁剪工具(如osmium-tool)将瑞士OSM数据裁剪为实际研究区域,只保留必要地理范围,大幅减少数据量。
    • 过滤GTFS数据:仅保留研究所需的线路、时段(如仅工作日时刻表)、交通方式,移除无需的文件(如无需精确线路可视化可删除shapes.txt)。
  • 调整Docker资源配置:
    修改Docker容器的内存限制,确保容器能分配到55GB以上内存,避免容器内存不足导致JVM无法使用分配的堆内存。

  • 升级r5r版本:
    安装最新版本的r5r包,新版本通常会优化内存使用,修复已知的内存问题。

  • 优化交换分区利用:
    确保Docker容器能访问宿主机的交换分区,在内存不足时可作为补充(虽速度远慢于内存,但能缓解溢出问题)。

内容的提问来源于stack exchange,提问作者Martin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 13:13:14