记一次python内存泄漏

最近跑代码,跑着跑着总会报error: X Error of failed request: BadAlloc (insufficient resources for operation) ......

或者直接被killed。

估计是内存泄漏,google了一下,发现有两个好用的工具:guppy和objgraph

可能因为是python3的环境guppy没装上,objgraph 可以装:pip3 install objgraph即可

通过他提供的Example,很容易定位内存泄漏的函数:

>>> class MyBigFatObject(object):
...     pass
...
>>> def computate_something(_cache={}):
...     _cache[42] = dict(foo=MyBigFatObject(),
...                       bar=MyBigFatObject())
...     # a very explicit and easy-to-find "leak" but oh well
...     x = MyBigFatObject() # this one doesn't leak
>>> objgraph.show_growth(limit=3) 
tuple                  5228     +5228
function               1330     +1330
wrapper_descriptor      967      +967
>>> computate_something()
>>> objgraph.show_growth() 
MyBigFatObject        2        +2
dict                797        +1

通过一段时间的耐心等待,可以看到

dict           19279     +1658
list           28305      +744
weakref         9368      +477
method          1588      +374
_XYPair          426      +312
Path             232      +160
Line2D           189      +140
MarkerStyle      189      +140
Affine2D         193      +138
tuple          19120      +134

Line2D, MarkerStyle, Affine2D这些函数的调用是会不断消耗内存的。

Google之,发现是matplotlib.pyplot中的函数,在plt.savefig()后没有清空会导致figure占用内存越来越大,最大的时候应该占了20个G?

减小画图的次数,并调用plt.clf(),内存不再泄漏。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值