Speicher in R löschen
Nachdem Sie eine Weile mit R-Skripten gearbeitet haben, kann es vorkommen, dass die R-Umgebung eine Menge In-Memory-Daten hortet und dadurch erhebliche Teile der Ressourcen des Computers zurückhält. Diese Situation kann damit enden, dass das R-System sich weigert, Code auszuführen, weil es keinen weiteren Speicher mehr zuweisen kann. Selbst wenn Sie Ihre R-Umgebung neu starten, kann es passieren, dass der Speicher nicht freigegeben wird.
Von dem Befehl rm(list=ls())
wird erwartet, dass er den von allen Objekten verwendeten Speicher freigibt, aber was er wirklich tut, ist, die Zeiger auf die verwendeten Speicherabschnitte zu zerstören. Das Problem ist, dass diese Speicherabschnitte nicht sofort für die Verwendung durch neue Tasks freigegeben werden.
Speicher löschen in R mit der Funktion gc
Der Garbage-Collection-Prozess läuft in R automatisch und periodisch, aber manchmal läuft er nicht genau dann, wenn Sie viel Speicher für eine große Datenoperation benötigen. In solch einer Situation kann es nützlich sein, die Funktion gc()
aufzurufen, um den Speicher in R zu leeren.
Der Hauptzweck von gc()
ist es, einen Bericht über die Speichernutzung anzuzeigen. Als Nebeneffekt löst der Aufruf von gc()
den Garbage-Collection-Prozess aus, der den Speicher leert. Wie die gc
-Dokumentation anmerkt, ist es daher eine gute Idee, gc()
aufzurufen, nachdem ein großes Objekt entfernt wurde, da diese Aktion R veranlasst, den nicht mehr benötigten Speicher freizugeben.
Sie können auch einen Aufruf von gc()
innerhalb einer Schleife einfügen, um den Garbage-Collection-Prozess wiederholt auszuführen. Beachten Sie nur, dass dieser Prozess einige Zeit in der Größenordnung von 100ms pro Aufruf benötigt, daher ist es nicht empfehlenswert, ihn innerhalb einer sich stark wiederholenden Schleife oder einer Schleife mit einer hohen Anzahl von Iterationen zu platzieren.
Wenn Sie Windows verwenden, können Sie die Funktion memory.size()
mit dem Parameter max=T
aufrufen, um die Menge des vom Betriebssystem zugänglichen Speichers anzuzeigen, oder mit max=F
, um anzuzeigen, wie viel Speicher zu einem bestimmten Zeitpunkt verwendet wird. Die R-Dokumentation erklärt weitere Aspekte der Funktion memory.size()
.
Um zu zeigen, wie der Speicherverbrauch beim Erstellen und Zerstören von Big-Data-Objekten variiert, können wir den folgenden Code in Windows ausführen, der einen Beispielvektor mit 100.000 Elementen erstellt, den Vektor entfernt und schließlich eine Garbage Collection durchführt. Zwischen den einzelnen Anweisungen können wir überprüfen, wie viel Speicher verwendet wird, indem wir die Funktion memory.size
mit dem Parameter max=F
ausführen.
memory.size (max = F)
Ausgabe:
[1] 32.6
Diese 32,6 MB sind das Minimum des von R verwendeten Speichers.
my_data <- sample (1:100000)
memory.size (max = F)
Ausgabe:
[1] 33.75
Wir können sehen, dass die erzeugten Beispieldaten etwa 1 MB Speicher verbrauchen, da der von der Funktion memory.size
gemeldete verbrauchte Speicher um 1 erhöht wurde.
rm (my_data)
memory.size (max = F)
Ausgabe:
[1] 33.75
Obwohl wir das Objekt entfernt haben, scheint der Speicher immer noch belegt zu sein.
gc()
Ausgabe:
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 315785 16.9 617200 33.0 617200 33.0
Vcells 633077 4.9 25730861 196.4 110503932 843.1
memory.size (max = F)
Ausgabe:
[1] 32.6
Die Speichermengen werden für jeden Computer unterschiedlich sein, aber Sie können sehen, dass die von memory.size
gemeldete Menge an freiem Speicher nach der Ausführung der Anweisung rm (my_data)
gleich bleibt und dass sie erst auf den Anfangswert von 32,6 MB zurückgeht, nachdem die Anweisung gc()
ausgeführt und der Speicher effektiv freigegeben wurde.