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
Buffer2Disk
V2EX  ›  Python

关于 Python OrderedDict 存在内存泄漏的问题

  •  
  •   Buffer2Disk · 2018-11-13 10:47:00 +08:00 · 2031 次点击
    这是一个创建于 1984 天前的主题,其中的信息可能已经有所发展或是发生改变。

    V 友们有用过这个类的吗? python 2.7 新加的

    使用过程中发现貌似存在内存泄漏问题,用 pympler 监控对象的内存, 发现 OrderedDict 对象 和 list 随着时间不断的缓慢增长(OrderedDict 对象的数量没有增加,内存占用却不断缓慢的增长)

    这里有一个关于 OrderedDict 内存泄漏的介绍: https://stackoverflow.com/a/46935255/2379891

    不过我没有像文中作者那样去 clear,而是不断的 del orderedDict[key], dump 内存中的对象后,也发现了不少和文中作者所说的那种 self-referencing list

    使用 OrderedDict 主要是为了实现一个 LRU 缓存(基于缓存失效时间 timeout),不知道 python 官方有没有高性能的 LRU cache 的实现

    5 条回复    2018-11-14 14:39:22 +08:00
    cgsv
        1
    cgsv  
       2018-11-14 10:02:10 +08:00 via iPhone
    在 gc 开启的情况下,self-referencing list 并不代表内存泄露,只是代表这部分内存只有在 gc 的时候才释放。另外,如果 gc 需要释放的对象定义了__del__方法,那么在 python2 中它就永远不会被回收
    Buffer2Disk
        2
    Buffer2Disk  
    OP
       2018-11-14 10:19:59 +08:00
    @cgsv 因为对性能问题比较敏感,所以没有开启 gc,想通过去除循环引用来解决。,。。。。
    cgsv
        3
    cgsv  
       2018-11-14 13:02:23 +08:00
    @Buffer2Disk 据我所知,Python2 的 OrderedDict 链表中使用的是强引用,所以有循环引用的问题。在 Python3 中 OrderedDict 链表使用的是 weakref,所以没有这个问题。可以考虑看一下 Python3 的实现
    Buffer2Disk
        4
    Buffer2Disk  
    OP
       2018-11-14 14:13:34 +08:00
    @cgsv 循环引用在什么样的情况下会内存泄漏(不开启 GC 的情况下)
    我测试了下,
    如果我直接 del OrderedDict 的对象,好像是会产生一个空的 self-refering list
    如果只是 del 其中某一个键值对,好像没有任何泄漏

    那么可以认为删除键值对的情况下,没有内存泄漏,可以这么理解嘛?
    cgsv
        5
    cgsv  
       2018-11-14 14:39:22 +08:00 via iPhone
    @Buffer2Disk 对的,单个元素的增删不会有内存泄露
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1223 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 23:55 · PVG 07:55 · LAX 16:55 · JFK 19:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.