记一次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(),内存不再泄漏。

你可能感兴趣的:(小操作)