从地址中删除matplotlib Line2D对象

时间:2018-07-06 13:47:04

标签: python matplotlib memory garbage-collection

我目前正在尝试改善脚本的内存使用率,该脚本所产生的图形随着时间的推移会非常“繁重”。

创建图形之前:

('Before:heap:',一组337个对象的分区。总大小为82832字节。

索引计数%大小%累积%种类(类/类的字典)

 0     75  22    32520  39     32520  39 dict (no owner)
 1     39  12    20904  25     53424  64 dict of guppy.etc.Glue.Interface
 2      8   2     8384  10     61808  75 dict of guppy.etc.Glue.Share
 3     16   5     4480   5     66288  80 dict of guppy.etc.Glue.Owner
 4     84  25     4280   5     70568  85 str
 5     23   7     3128   4     73696  89 list
 6     39  12     2496   3     76192  92 guppy.etc.Glue.Interface
 7     16   5     1152   1     77344  93 guppy.etc.Glue.Owner
 8      1   0     1048   1     78392  95 dict of guppy.heapy.Classifiers.ByUnity
 9      1   0     1048   1     79440  96 dict of guppy.heapy.Use._GLUECLAMP_

<15更多行。输入例如查看“ _.more”。>)

创建它们之后:

('之后:堆:',一组89339个对象的分区。总大小= 32584064字节。

索引计数%大小%累积%种类(类/类的字典)

 0   2340   3  7843680  24   7843680  24 dict of matplotlib.lines.Line2D
 1   1569   2  5259288  16  13102968  40 dict of matplotlib.text.Text
 2  10137  11  3208536  10  16311504  50 dict (no owner)
 3   2340   3  2452320   8  18763824  58 dict of matplotlib.markers.MarkerStyle
 4   2261   3  2369528   7  21133352  65 dict of matplotlib.path.Path
 5    662   1  2219024   7  23352376  72 dict of matplotlib.axis.XTick
 6   1569   2  1644312   5  24996688  77 dict of matplotlib.font_manager.FontProperties
 7  10806  12   856816   3  25853504  79 list
 8   8861  10   708880   2  26562384  82 numpy.ndarray
 9   1703   2   476840   1  27039224  83 dict of matplotlib.transforms.Affine2D

<181更多行。输入例如查看“ _.more”。>)

然后,我这样做:

figures=[manager.canvas.figure for manager in matplotlib._pylab_helpers.Gcf.get_all_fig_managers()]
for i, figure in enumerate(figures): figure.clf(); plt.close(figure)
figures=[manager.canvas.figure for manager in matplotlib._pylab_helpers.Gcf.get_all_fig_managers()]#here, figures==[]
del figures
hp.heap()

此打印:

一组71966对象的分区。总大小= 23491976字节。

索引计数%大小%累积%种类(类/类的字典)

 0   1581   2  5299512  23   5299512  23 dict of matplotlib.lines.Line2D
 1   1063   1  3563176  15   8862688  38 dict of matplotlib.text.Text
 2   7337  10  2356952  10  11219640  48 dict (no owner)
 3   1584   2  1660032   7  12879672  55 dict of matplotlib.path.Path
 4   1581   2  1656888   7  14536560  62 dict of matplotlib.markers.MarkerStyle
 5    441   1  1478232   6  16014792  68 dict of matplotlib.axis.XTick
 6   1063   1  1114024   5  17128816  73 dict of matplotlib.font_manager.FontProperties
 7   7583  11   619384   3  17748200  76 list
 8   6500   9   572000   2  18320200  78 __builtin__.weakref
 9   6479   9   518320   2  18838520  80 numpy.ndarray

另外199行。输入例如查看“ _.more”。>

因此,似乎已经删除了一些matplotlib对象,但并非全部。

首先,我想看一下剩下的所有Line2D对象:

objs = [obj for obj in gc.get_objects() if isinstance(obj, matplotlib.lines.Line2D)]
#[... very long list with e.g., <matplotlib.lines.Line2D object at 0x1375ede590>, <matplotlib.lines.Line2D object at 0x1375ede4d0>, <matplotlib.lines.Line2D object at 0x1375eec390>, <matplotlib.lines.Line2D object at 0x1375ef6350>, <matplotlib.lines.Line2D object at 0x1375eece10>, <matplotlib.lines.Line2D object at 0x1375eec690>, <matplotlib.lines.Line2D object at 0x1375eec610>, <matplotlib.lines.Line2D object at 0x1375eec590>, <matplotlib.lines.Line2D object at 0x1375eecb10>, <matplotlib.lines.Line2D object at 0x1375ef6850>, <matplotlib.lines.Line2D object at 0x1375eec350>]
print len(objs)#29199 (!!!)

所以现在我希望能够访问所有这些对象以删除它们并清除内存,但是我不知道该怎么做...

感谢您的帮助!

0 个答案:

没有答案