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

Ubuntu 16.04下使用opencv-python的cv2.imdecode出现内存泄漏求助

解决方案

1. 优先尝试升级OpenCV版本(最简便)

你当前用的opencv-python==3.4.0.14是存在Linux平台imdecode内存泄漏的已知版本,该bug在后续版本已被修复。你可以直接升级到兼容Python3.6的最新稳定版:

pip install opencv-python==4.5.5.62

该版本API与3.4.x系列基本兼容,无需修改业务代码,90%以上同场景泄漏问题可直接解决。

2. 若必须保留3.4.0.14版本,选择以下任一方案

方案A:替换系统内存分配器

该泄漏本质是OpenCV底层申请的内存被Linux默认的ptmalloc内存分配器持有,未归还给操作系统。使用jemalloc替代ptmalloc即可解决:

# 安装jemalloc
sudo apt install libjemalloc-dev
# 运行程序前预加载jemalloc
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.1 python greeter_server.py
方案B:手动编译OpenCV

不使用PyPI的预编译包,自行编译时指定使用系统libjpeg替代OpenCV自带的旧版libjpeg(泄漏根源):

# 先卸载现有opencv-python
pip uninstall opencv-python
# 安装依赖
sudo apt install libjpeg-dev cmake build-essential python3-dev
# 编译opencv时添加参数
cmake -D CMAKE_BUILD_TYPE=RELEASE \
      -D CMAKE_INSTALL_PREFIX=/usr/local \
      -D PYTHON_EXECUTABLE=$(which python3) \
      -D WITH_JPEG=ON \
      -D BUILD_JPEG=OFF \
      # 其他需要的参数
      ..
make -j$(nproc) && sudo make install

3. 额外优化点

你代码里用到的np.fromstring已被弃用,替换为np.frombuffer(jpeg, np.uint8),可排除numpy层不必要的内存拷贝干扰。


问题原因说明

  • Mac平台无泄漏是因为其预编译OpenCV包调用的是系统原生libjpeg,且Mac默认内存分配器逻辑与Linux ptmalloc不同,不会持有未使用的内存。
  • 你测试时del image仅删除了Python层面的对象引用,OpenCV底层C层申请的内存未被释放,因此不会降低内存占用。

内容的提问来源于stack exchange,提问作者C.Rose

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 07:36:04