[PYTHON] Ich möchte das Problem des Speicherverlusts bei der Ausgabe einer großen Anzahl von Bildern mit Matplotlib lösen

Überblick

Es ist nicht ungewöhnlich, Matplotlib zur Visualisierung von Daten und zur Ausgabe von Bildern zu verwenden. Wenn Sie zu diesem Zeitpunkt ein Bild mit savefig ausgeben, scheint ein leichter Speicherverlust aufzutreten. Es gibt kein besonderes Problem, wenn die Anzahl der Bilder mehrere hundert bis mehrere tausend beträgt, aber es wird ein Problem, wenn Zehntausende bis hunderttausende Bilder über Nacht für eine beträchtlich große Datenmenge ausgegeben werden sollen.

Betriebsumgebung

Python:3.7.7 Matplotlib:3.2.2

Umfrage

Ich habe die Speichererhöhung mit dem folgenden Code überprüft.

import os
import numpy as np
import datetime as dt
import matplotlib.pyplot as plt
import psutil

#Daten zur Messung
memory_start = psutil.virtual_memory().used
time_start = dt.datetime.now()
fw = open('./Messprotokoll.csv','w')
fw.write('i,time_delta[s],memory[KB]\n')
 
#Ausgabe von 10.000 Blatt
for i in range(10000):
    #Generieren Sie zwei Datentypen
    size = 10000
    x1 = np.random.randn(size)
    y1 = 0.5*x1 + 0.5**0.5*np.random.randn(size)
    x2 = np.random.randn(size)
    y2 = np.random.randn(size)

    #Initialisieren Sie das Diagramm und erstellen Sie ein Streudiagramm
    fig, ax = plt.subplots(figsize=(8,8))
    ax.scatter(x1, y1, alpha=0.1, color='r', label='data1')
    ax.scatter(x2, y2, alpha=0.1, color='g', label='data2')
    
    #Fügen Sie Labels und Legenden hinzu
    ax.set_xlabel('X')
    ax.set_ylabel('Y')
    ax.legend(loc='upper right')
    
    #Bildausgabe
    plt.savefig('./output/{:05}.png'.format(i))
    
    #Diagrammdaten freigeben *
    #plt.clf()
    #plt.cla()
    plt.close()
    
    #Messen Sie den Speicherzuwachs von Anfang an und die Zeit einer Schleife
    memory_delta = psutil.virtual_memory().used - memory_start
    time_end = dt.datetime.now()
    time_delta = time_end - time_start
    time_start = time_end
    fw.write('{},{},{}\n'.format(i+1, time_delta.microseconds/1e6, memory_delta/1e3))

fw.close()

Beim Freigeben des Speichers des Graphen wurde gemessen, wann nur das Schließen durchgeführt wurde und wann cla und clf durchgeführt und dann geschlossen wurden.

graph2.PNG

Das Ausmaß der Speichererhöhung wird auf etwa die Hälfte unterdrückt, wenn cla und clf nur vor dem Fall des Schließens ausgeführt werden. Es kann jedoch bestätigt werden, dass es in beiden Fällen zunimmt.

was wirst du tun?

Was kann ich tun, um zu verhindern, dass der Speicher größer wird, egal wie viele Bilder ausgegeben werden? Infolge verschiedener Versuche wurde der Speicherverlust durch Umschreiben des Codes wie folgt unterdrückt. Ich konnte das Bild richtig ausgeben.

#Am Anfang nur einmal initialisieren
fig, ax = plt.subplots(figsize=(8,8))

for i in range(10000):
    #Generieren Sie zwei Datentypen
    x1 = np.random.randn(size)
    y1 = 0.5*x1 + 0.5**0.5*np.random.randn(size)
    x2 = np.random.randn(size)
    y2 = np.random.randn(size)
    
    ax.scatter(x1, y1, alpha=0.1, color='r', label='data1')
    ax.scatter(x2, y2, alpha=0.1, color='g', label='data2')
    
    ax.set_xlabel('X')
    ax.set_ylabel('Y')    
    ax.legend(loc='upper right')
    
    plt.savefig('./output/{:05}.png'.format(i))

    #Mach nur cla
    #clf,Wenn Sie es schließen, können Sie danach nicht mehr in das Diagramm schreiben.
    #Im Gegenteil, wenn Sie cla nicht ausführen, überlappt es sich immer mehr mit dem vorherigen Bild.
    plt.cla()

graph.PNG

Wenn Sie die Bildgröße in der Mitte nicht ändern möchten, kann jedes Diagramm damit behandelt werden, aber ich bin mir nicht so sicher. Seien Sie also vorsichtig, wenn Sie es verwenden.

Recommended Posts

Ich möchte das Problem des Speicherverlusts bei der Ausgabe einer großen Anzahl von Bildern mit Matplotlib lösen
Wenn ich mit matplotlib eine große Anzahl von Diagrammen generiere, möchte ich das Diagramm nicht auf dem Bildschirm anzeigen (Jupyter-Umgebung).
Ich wollte das ABC164 A ~ D-Problem mit Python lösen
TensorFlow Aus einer großen Anzahl von Bildern lernen ... (ungelöstes Problem) → 12/18 Gelöst
Ich möchte manuell eine Legende mit matplotlib erstellen
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Beim 15. Offline-Echtzeitversuch habe ich versucht, das Problem des Schreibens mit Python zu lösen
Ich habe versucht, das Problem der Kombinationsoptimierung mit Qiskit zu lösen
Ich habe versucht, das Problem von F02 zu lösen, wie man mit Python offline in Echtzeit schreibt
[Einführung in StyleGAN] Ich habe mit "The Life of a Man" ♬ gespielt
Versuchen Sie, das N Queen-Problem mit SA von PyQUBO zu lösen
Ich möchte den Anfang des nächsten Monats mit Python ausgeben
Ich möchte die Position meines Gesichts mit OpenCV überprüfen!
[Django] Was tun, wenn das zu erstellende Modell viele Felder enthält?
Verwalten Sie die Überlappung, wenn Sie ein Streudiagramm mit einer großen Datenmenge zeichnen (Matplotlib, Pandas, Datashader).
Ich möchte mit matplotlib ein Diagramm mit Wellenlinien in der Mitte erstellen (ich möchte den Eindruck manipulieren).
Ich habe versucht, die Anzahl der im Inland infizierten Menschen der neuen Korona mit einem mathematischen Modell vorherzusagen
Eine Geschichte, in der der Algorithmus zu einem lächerlichen Ergebnis kam, als er versuchte, das Problem der reisenden Verkäufer richtig zu lösen
So schreiben Sie, wenn Sie eine Zahl nach der Gruppennummer setzen möchten, die durch einen regulären Ausdruck in Python ersetzt werden soll
Ich möchte ausgeben, während der Wert des Typs (z. B. datetime) konvertiert wird, der bei der Ausgabe von json mit Python nicht unterstützt wird
Möchten Sie ein einfaches Klassifizierungsproblem lösen?
(Matplotlib) Ich möchte ein Diagramm mit einer in Pixel angegebenen Größe zeichnen
Ich möchte eine Liste in der Reihenfolge anderer Listen sortieren
Ich möchte meine Gefühle mit den Texten von Mr. Children ausdrücken
Bedeutet Memo, wenn versucht wird, maschinelles Lernen mit 50 Bildern durchzuführen
Ich möchte das automatische Löschen des tmp-Bereichs in RHEL7 stoppen
Versuchen Sie, ein festgelegtes Problem der High-School-Mathematik mit Python zu lösen
Python: Ich möchte die Verarbeitungszeit einer Funktion genau messen
Ich möchte die Anzahl von num_boost_round anzeigen, wenn Early_stopping mithilfe des XGBoost-Rückrufs angewendet wird (nicht erreicht).
Ich möchte Matplotlib zu einem dunklen Thema machen
Versuchen Sie, das Fizzbuzz-Problem mit Keras zu lösen
Versuchen Sie, das Problem des Handlungsreisenden mit einem genetischen Algorithmus (Python-Code) zu lösen.
[AtCoder] Lösen Sie ein Problem von ABC101 ~ 169 mit Python
Ich möchte nur verschiedene Zeilen der Textdatei mit diff anzeigen
Ich möchte ein Spiel mit Python machen
Beachten Sie die Lösung, da Django nicht mit pip installiert werden konnte
Ich möchte einen Lebenszyklus in der Aufgabendefinition von ECS festlegen
Ich möchte dem Anfang einer WAV-Datei 1 Sekunde lang Stille hinzufügen
Ich möchte eine Liste der WebDAV-Dateien im Modul Anfragen anzeigen
Ich möchte APG4b mit Python lösen (Kapitel 2)
Ich möchte das Erscheinungsbild von zabbix anpassen
Ich möchte mit Python in eine Datei schreiben
Ich wollte die Anzahl der Zeilen in mehreren Dateien wissen und versuchte, sie mit einem Befehl abzurufen
Ich habe versucht, ein Modell mit dem Beispiel von Amazon SageMaker Autopilot zu erstellen
Ich habe versucht, mit dem Seq2Seq-Modell von TensorFlow so etwas wie einen Chatbot zu erstellen
[Python] Ich möchte nur den Index verwenden, wenn ich eine Liste mit einer for-Anweisung schleife
Wie identifiziere ich das Element mit der geringsten Anzahl von Zeichen in einer Python-Liste?
Ich habe versucht, das Problem der Optimierung der Platzierung virtueller Maschinen (einfache Version) mit blueqat zu lösen
Ich möchte die Standortinformationen von GTFS Realtime auf Jupyter zeichnen! (Mit Ballon)
Ich wollte viele Bilder sammeln, also habe ich versucht, "Google Image Download" zu verwenden.
Wenn die Variable, die Sie in Matplotlib als hochgestellt verwenden möchten, aus zwei oder mehr Zeichen besteht
Ein Memo darüber, wie man das schwierige Problem der Erfassung von FX mit AI überwinden kann
Ein Hinweis auf Missverständnisse beim Versuch, das gesamte selbst erstellte Modul mit Python3 zu laden
Ich möchte über die Verbindungsumgebung benachrichtigt werden, wenn RaspberryPi eine Verbindung zum Netzwerk herstellt
Beschleunigen Sie eine große Anzahl einfacher Abfragen in MySQL
Ich möchte Bilder von Katzen von Instagram erkennen