Как удалить строки в графике Matplotlib
Как я могу удалить строку (или строки) осей matplotlib таким образом, чтобы она фактически собирала мусор и освобождала память? Приведенный ниже код, похоже, удаляет строку, но никогда не освобождает память (даже с явными вызовами gc.соберите ())
from matplotlib import pyplot
import numpy
a = numpy.arange(int(1e7))
# large so you can easily see the memory footprint on the system monitor.
fig = pyplot.Figure()
ax = pyplot.add_subplot(1, 1, 1)
lines = ax.plot(a) # this uses up an additional 230 Mb of memory.
# can I get the memory back?
l = lines[0]
l.remove()
del l
del lines
# not releasing memory
ax.cla() # this does release the memory, but also wipes out all other lines.
Так есть ли способ просто удалить одну строку из осей и вернуть память? Это решение также не работает.
4 ответа:
Я показываю, что сочетание
lines.pop(0)
l.remove()
иdel l
делает трюк.from matplotlib import pyplot import numpy, weakref a = numpy.arange(int(1e3)) fig = pyplot.Figure() ax = fig.add_subplot(1, 1, 1) lines = ax.plot(a) l = lines.pop(0) wl = weakref.ref(l) # create a weak reference to see if references still exist # to this object print wl # not dead l.remove() print wl # not dead del l print wl # dead (remove either of the steps above and this is still live)
Я проверил ваш большой набор данных, и выпуск памяти также подтверждается на системном мониторе.
конечно, более простой способ (когда не проблема-стрельба) было бы выскочить из списка и позвонить
remove
на линейном объекте без создания жесткой ссылки на него:lines.pop(0).remove()
это очень длинное объяснение, которое я напечатал для своего коллеги. Я думаю, что это было бы полезно и здесь. Но будьте терпеливы. Я добираюсь до реальной проблемы, которая у вас есть к концу. Так же, как тизер, это вопрос наличия дополнительных ссылок на ваш
Line2D
объекты, висящие вокруг.предупреждение: еще одна заметка, прежде чем мы погрузимся. Если вы используете IPython для проверки этого, IPython сохраняет ссылки самостоятельно, и не все из них слабаки. Итак, тестирование сборки мусора в IPython не работает. Это просто запутывает дело.
Ладно, поехали. Каждый
Я пробовал много разных ответов на разных форумах. Я думаю, это зависит от машины, которую вы разрабатываете. Но я использовал заявление
ax.lines = []
и прекрасно работает. Я не использую cla (), потому что он удаляет все определения, которые я сделал для участка
Ex.
pylab.setp(_self.ax.get_yticklabels(), fontsize=8)
но я пытался удалить строки много раз. Также используя библиотеку weakref, чтобы проверить ссылку на эту строку, пока я удалял, но ничего не работало мне.
надеюсь, что это работает для кого-то еще =D