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
相关产品推荐
相关产品推荐

