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.
Python:3.7.7 Matplotlib:3.2.2
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.
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 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()
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