V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
allenwuli
V2EX  ›  Python

opencv Python 内存泄漏

  •  
  •   allenwuli · 2020-10-14 18:20:27 +08:00 · 3720 次点击
    这是一个创建于 1525 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大佬们,有人碰到下面 这样的情况吗?

    def cv2_image(path): img = cv2.imread(path) return img

    for i in file_path: img = cv2_img(i)

    重复的调用 cv2_img()读图,然后内存爆掉。

    8 条回复    2020-10-15 15:29:18 +08:00
    chesterzzy
        1
    chesterzzy  
       2020-10-14 19:30:50 +08:00
    不该爆吗?
    allenwuli
        2
    allenwuli  
    OP
       2020-10-14 22:15:23 +08:00
    @chesterzzy 不该爆啊
    xiaoming1992
        3
    xiaoming1992  
       2020-10-14 23:26:37 +08:00 via Android
    不停往内存读,垃圾不能回收,肯定要爆啊
    allenwuli
        4
    allenwuli  
    OP
       2020-10-15 09:48:35 +08:00
    @xiaoming1992 一批一批的读图的,一批处理完结束。再读下一批,变量有释放,引用计数为 0 了,但是还是占着内存。用 gc.collect(),都不能释放。这应该是 opencv 的 bug,python 的 opencv 不知道怎么解决,c 语言的可以使用 release()。
    tkmiles
        5
    tkmiles  
       2020-10-15 10:22:09 +08:00
    @allenwuli


    import cv2



    def main():
    def cv2_image(path):
    img = cv2.imread(path)
    return img
    p = r"c:\miyou.jpg"
    file_path = [p] * 1000
    for i in file_path:
    img = cv2_image(i)
    print("done")
    return

    if __name__ == "__main__":
    main()

    单独这么测内存没泄露呀

    windows python3.6 opencv-python-3.3.3
    czdpzc
        6
    czdpzc  
       2020-10-15 11:07:50 +08:00
    同测没爆内存
    Python 3.7.7 opencv-python 4.3.0
    allenwuli
        7
    allenwuli  
    OP
       2020-10-15 14:11:25 +08:00
    @tkmiles 这么测应该是不行的,同一张图读一千次。在内存里应该只有一张图
    czdpzc
        8
    czdpzc  
       2020-10-15 15:29:18 +08:00
    @allenwuli
    5 楼那么测应该是对的。但我也用 CelebA 数据库试了一下,202599 张人脸图像,一切正常。
    ```
    import cv2 as cv
    import os

    def img_read(path):
    img = cv.imread(path)
    return img

    def main():
    path = "celebA_dataset/img_align_celeba/"
    imgs = os.listdir(path)
    print(len(imgs))

    count=0
    for i in imgs:
    img = img_read(os.path.join(path,i))
    count+=1
    print(count)

    print("done")

    if __name__ == "__main__":
    main()
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5029 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 05:42 · PVG 13:42 · LAX 21:42 · JFK 00:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.