# nav2_map_server加载大地图OOM：Eigen中间缓冲与GraphicsMagick内存。

> 原文链接：https://robotics.hellobike.com/pitfalls/2026-10-09-navigation2-6413
> 频道：pitfalls | 更新日期：2026-10-09 | 标签：auto, github-issue, navigation2
> 核心摘要：针对nav2_map_server加载大地图时峰值内存过高导致OOM，通过重构Eigen向量化路径减少中间缓冲已验证有效，并提议增加原生PGM解析绕过GraphicsMagick冗余分配。

# nav2_map_server加载大地图OOM：Eigen中间缓冲与GraphicsMagick内存。

::: v-pre
> 本文由 AI 根据公开内容整理，可能有误，请以原文为准：[Map server memory peak usage concern](https://github.com/ros-navigation/navigation2/issues/6413)（GitHub ros-navigation/navigation2 #6413）

**状态**：有绕过办法

## 问题

`nav2_map_server` 的 `loadMapFromFile()` 在加载 27000x24000px（6.48亿像素）地图时峰值 RSS 达 ~13GB，约为最终 `OccupancyGrid` 消息大小的 20 倍，导致 Jetson 等受限硬件触发 Linux OOM-killer。

## 环境

Jetson 系列机器人；ROS 2 Rolling 分支；nav2_map_server；libgraphicsmagick-q16-3 1.3.38；Linux 系统；27000x24000px PGM 地图文件

## 解决办法

1. 重构 Eigen 向量化路径：直接在灰度缓冲区上比较阈值（保持 negate/threshold 语义等价），并通过 `Eigen::Map` 将垂直翻转结果直接写入 `msg.data`，移除 normalized、occupied/free mask 及 flipped 临时矩阵，实测峰值内存从 12.96GB 降至约 8.43GB（Rolling 分支测试降幅约 25%），且输出 SHA256 校验一致。
2. 实现原生 PGM 快速加载路径以绕过 GraphicsMagick 冗余内存分配：编写 `tryLoadPgm8` 函数，仅处理标准 8-bit 二进制 PGM（Magic Number 为 `P5` 且 maxval=255）；按字节解析头部（支持注释），严格校验头尾空白符；若格式不符或解析失败则返回 false 回退至 GraphicsMagick 原有逻辑，避免为简单灰度图分配额外 IndexPacket 缓存。

讨论原作者：@Sunart24 等，版权归原作者所有。
:::

## 原始参考来源 (Sources)

- [GitHub ros-navigation/navigation2 #6413：Map server memory peak usage concern](https://github.com/ros-navigation/navigation2/issues/6413)