# NG
#Der Speicher wird nicht freigegeben
plt.close()
# OK
#Der Speicher wird freigegeben
plt.clf()
plt.close()
# NG
#Der Speicher wird nicht freigegeben, wenn die Reihenfolge umgekehrt wird
# plt.close()Wenn Sie die Abbildung mit schließen, können Sie den gezeichneten Inhalt nicht löschen.
plt.close()
plt.clf()
Als ich Tausende von Grafiken gleichzeitig gezeichnet habe, ist ein Speicherfehler aufgetreten. Da ich jedes Mal plt.close ()
machte, fragte ich mich warum und untersuchte es mit der folgenden experimentellen Methode. Als Ergebnis wurde festgestellt, dass der Speicher nicht nur von plt.close ()
freigegeben wurde. Und ich fand heraus, dass der Speicher durch Ausführen von plt.clf () → plt.close ()
freigegeben wird.
Zeichnen Sie zehnmal hintereinander ein Diagramm mit einer großen Speichergröße. Notieren Sie die Speichernutzung am Ende jedes Diagramms und untersuchen Sie die Beziehung zwischen der Anzahl der Diagramme und der Speichernutzung. Führen Sie diesen Vorgang in den folgenden 4 Mustern aus.
Nachbearbeitungsmethode | |
---|---|
Muster 1 | plt.clf() |
Muster 2 | plt.clf() → plt.close() |
Muster 3 | plt.close() |
Muster 4 | plt.close() → plt.clf() |
** Starten Sie den Kernel jedoch jedes Mal für jedes Muster neu. ** Hiermit wird die Basislinie für die Speichernutzung ausgerichtet.
Der Code dafür ist unten.
import matplotlib.pyplot as plt
import numpy as np
import psutil
mem_ary = []
#10 mal zeichnen
for i in range(10):
#Zeichnen Sie ein Diagramm mit einer großen Speichergröße
x = np.arange(1e7)
y = np.arange(1e7)
plt.plot(x, y)
# ===================================================
#Führen Sie eines der folgenden Muster 1 bis 4 aus
#Kommentieren Sie den Rest aus
# ===================================================
#Muster 1
plt.clf()
#Muster 2
plt.clf()
plt.close()
#Muster 3
plt.close()
#Muster 4
plt.close()
plt.clf
# ===================================================
#Speichern Sie die Speichernutzung
mem = psutil.virtual_memory().used / 1e9
mem = round(mem, 1)
mem_ary.append(mem)
Die Ergebnisse sind in der folgenden Grafik zusammengefasst.
Nur plt.clf () → plt.close ()
, die Speichernutzung hat sich nicht erhöht. Daher können Sie sehen, dass plt.clf () → plt.close ()
durchgeführt werden sollte.
Wenn Sie die Reihenfolge umkehren und "plt.close () → plt.clf ()" auswählen, wird der Speicher nicht freigegeben. Du solltest vorsichtig sein. Ich denke, die Ursache ist wahrscheinlich, dass Sie den Zeichnungsinhalt nicht löschen können, wenn Sie die Abbildung mit plt.close ()
schließen. (Referenz: Offizieller DOC von plt.close (), [Offizieller DOC von plt.clf ()](https: // matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.close))
matplotlib:3.2.1
Recommended Posts