удалить объект line2D matplotlib с адреса - PullRequest
0 голосов
/ 06 июля 2018

В настоящее время я пытаюсь улучшить использование памяти скриптом, который выдает фигуры, которые со временем становятся очень «тяжелыми».

перед созданием фигур:

('До того как:куча: ', Разделение набора из 337 объектов. Общий размер = 82832 байта.

Индекс Количество% Размер% Совокупный% Вид (класс / dict класса)

 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» для просмотра.>)

И после их создания:

('After: heap:', Разделение набора из 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 (!!!)

Так что теперь я хотел бы иметь возможность получить доступ ко всем этим объектам, чтобы иметь возможность удалять их и очищать память, но я не знаю, как я мог это сделатьчто ...

Спасибо за вашу помощь!

...