Comment faire pour supprimer des lignes dans une parcelle Matplotlib
Comment puis-je supprimer une ligne (ou des lignes) d'un matplotlib axes de telle manière qu'il obtient réellement les ordures collectées et libère la mémoire? Le code ci-dessous apparaît pour supprimer la ligne, mais jamais libère la mémoire (même avec des appels explicites à la gc.collect())
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.
Donc, il y a un moyen de supprimer une seule ligne à partir d'une axes et obtenir le secours de la mémoire?
Cette solution potentielle aussi ne fonctionne pas.
Vous devez vous connecter pour publier un commentaire.
Je me montre qu'une combinaison de
lines.pop(0)
l.remove()
etdel l
fait le tour.J'ai vérifié votre grand jeu de données et la libération de la mémoire est confirmé sur le moniteur système ainsi.
Bien sûr, la manière la plus simple (quand pas de problème de prise de vue) serait à la pop à partir de la liste et appeler
remove
sur la ligne d'objet sans création d'une dur de référence:C'est une très longue explication que j'ai tapé pour un collègue de la mine. Je pense qu'il serait utile ici aussi. Être patient, si. J'arrive à le réel problème que vous rencontrez, vers la fin. Juste un teaser, c'est une question d'avoir les références de votre
Line2D
objets qui traînent.AVERTISSEMENT: Une autre note avant de nous plonger dans. Si vous utilisez IPython pour un test, IPython conserve une référence qui lui est propre et pas tous d'entre eux sont weakrefs. Ainsi, les tests de la collecte des ordures dans IPython ne fonctionne pas. Il confond tout simplement des questions.
Bon, nous y voilà. Chaque
matplotlib
objet (Figure
,Axes
, etc) fournit un accès à son enfant des artistes par le biais de divers attributs. L'exemple suivant est très long, mais devrait être éclairante.Nous commençons par créer un
Figure
objet, puis ajouter uneAxes
objet de ce chiffre. Notez queax
etfig.axes[0]
sont le même objet (mêmeid()
).Cela s'étend aussi à des lignes dans un des axes de l'objet:
Si vous appelez
plt.show()
à l'aide de ce qui a été fait ci-dessus, vous pouvez voir une figure contenant un ensemble d'axes et une seule ligne:Maintenant, alors que nous avons vu que le contenu de
lines
etax.lines
est le même, il est très important de noter que l'objet référencé par lalines
variable n'est pas le même que l'objet vénéraient, parax.lines
comme on peut le voir par ce qui suit:En conséquence, la suppression d'un élément de
lines
ne fait rien pour le courant de l'intrigue, mais la suppression d'un élément deax.lines
supprime cette ligne à partir de la trame actuelle. Donc:Donc, si vous exécutez la deuxième ligne de code, vous souhaitez supprimer le
Line2D
objet contenu dansax.lines[0]
à partir de la courbe et il serait parti. Notez que cela peut être fait viaax.lines.remove()
ce qui signifie que vous pouvez enregistrer unLine2D
instance dans une variable, puis la passer àax.lines.remove()
à supprimer cette ligne, comme ceci:Tous les travaux ci-dessus pour
fig.axes
aussi bien qu'il travaille pourax.lines
Maintenant, le vrai problème ici. Si nous conservons la référence contenue dans
ax.lines[0]
dans unweakref.ref
objet, puis essayez de le supprimer, on remarquera qu'il n'a pas obtenir ramasse miettes:La référence est toujours en direct! Pourquoi? C'est parce qu'il y a encore une autre référence à la
Line2D
objet que la référence, danswr
points. Rappelez-vous commentlines
n'ont pas le même ID queax.lines
, mais contenant les mêmes éléments? Eh bien, c'est ça le problème.Donc, la morale de l'histoire est, nettoyer après vous. Si vous vous attendez à quelque chose pour être nettoyée, mais ce n'est pas le cas, vous êtes susceptible de laisser une référence à traîner quelque part.
remove()
fonction qui va les nettoyer, de les sortir de la mpl côté des choses, et puis vous avez seulement besoin de garder une trace de vos références.J'ai essayé beaucoup de réponses différentes dans les différents forums. Je suppose que ça dépend de la machine de votre développement. Mais je pense avoir utilisé la déclaration
et fonctionne parfaitement. Je ne l'utilise pas (cla) cause il supprime toutes les définitions que j'ai fait à l'intrigue
Ex.
mais j'ai essayé de supprimer les lignes à plusieurs reprises. Aussi à l'aide de la weakref bibliothèque pour vérifier la référence de cette ligne alors que j'étais à la suppression, mais rien n'a fonctionné pour moi.
Espère que cela fonctionne pour quelqu'un d'autre =D
(en utilisant le même exemple que le gars ci-dessus)