wake-up-neo.net

Was ist der Unterschied zwischen gc () und rm ()

Ich spüle regelmäßig den Speicher in R mit einem Aufruf an rm(list=ls()).
Muss ich den Garbage Collector gc() danach anrufen?

Was ist der Unterschied zwischen diesen beiden Funktionen? Ruft gc() für bestimmte Variablen rm() auf?

52
RockScience

Zunächst ist es wichtig zu wissen, dass sich die beiden darin unterscheiden, dass gckeine - Variablen, die Sie noch verwenden, nicht löscht. Dadurch wird nur der Speicher für diejenigen frei, auf die Sie keinen Zugriff mehr haben rm() oder beispielsweise in einer Funktion erstellt, die seitdem zurückgegeben wurde). Wenn Sie gc() ausführen, verlieren Sie niemals Variablen.

Die Frage, ob Sie nach dem Aufruf von gc()rm() aufrufen sollten, ist jedoch eine gute. Die Dokumentation für gc hilfreich Hinweise:

Ein Aufruf von gc bewirkt, dass eine Speicherbereinigung stattfindet. Dies erfolgt auch automatisch ohne Eingreifen des Benutzers. Der Hauptzweck des Aufrufs von gc ist der Bericht über die Speichernutzung.

Es kann jedoch nützlich sein, gc aufzurufen, nachdem ein großes Objekt entfernt wurde, da dies dazu führen kann, dass R den Speicher an das Betriebssystem zurückgibt.

Die Antwort ist also, dass es gut sein kann, gc() aufzurufen (und zumindest nicht schaden kann), obwohl dies wahrscheinlich trotzdem ausgelöst würde (wenn nicht sofort, dann bald).

68
David Robinson

Persönlich möchte ich die gc() in Loops einfügen, um RAM freizugeben, wenn die Loops den verfügbaren Speicherplatz füllen. So etwas wie

for(i in 1:1000){
res[[i]] = some operation
gc()
}
0
Gabriel123

Zu ThankGoats Kommentar zur gc-Strafe, obwohl dies wahr ist, könnte man natürlich entscheiden, gc alle N-Iterationen in einer Schleife aufzurufen (wobei N auf verschiedene Weise parametriert werden kann). Bei Schleifen, bei denen die Anzahl der Iterationen groß ist, die Ressourcennutzung innerhalb einer bestimmten Iteration jedoch bescheidener ist, kann es nicht notwendig sein, GC und jede Iteration durchzuführen, um die gewünschte Leistung wieder herzustellen.

Wenn Sie mit einer sehr großen Anzahl von sehr häufigen Iterationen arbeiten, ist dies natürlich eine andere Geschichte, aber zu diesem Zeitpunkt kann es durchaus vorkommen, dass der Code einfach vektorisiert und/oder sogar in einer anderen Sprache geschrieben werden muss .

0
Pascoe