最近跑代码,跑着跑着总会报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(),内存不再泄漏。