[PYTHON] Der Speicher wird nicht nur von plt.close () freigegeben. Es sollte plt.clf () → plt.close () sein.

einpacken

# 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()

Hintergrund

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.

experimentelle Methode

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)

Ergebnisse und Schlussfolgerungen

Die Ergebnisse sind in der folgenden Grafik zusammengefasst.

スクリーンショット 2020-06-01 午後11.38.11.png

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))

Ausführung

matplotlib:3.2.1

Recommended Posts

Der Speicher wird nicht nur von plt.close () freigegeben. Es sollte plt.clf () → plt.close () sein.
Wenn es nicht leicht zu verstehen ist, kann es nicht verbessert werden.
Ich habe Gerüchte gehört, dass Malloc langsam ist und im Speicher gespeichert werden sollte, also habe ich es verglichen.