remove objects r memory-management garbage-collection

objects - Cuál es la diferencia entre gc() y rm()



remove objects r (2)

Estoy limpiando periódicamente la memoria en R usando una llamada a rm(list=ls()) .
¿Debo llamar al recolector de basura gc() después de eso?

¿Cuál es la diferencia entre estas 2 funciones? ¿ gc() llama a rm() para ciertas variables?


En primer lugar, es importante tener en cuenta que los dos son muy diferentes en cuanto a que gc no elimina ninguna variable que todavía esté utilizando; solo libera la memoria para aquellos a los que ya no tiene acceso (ya sea que se elimine usando rm() o , por ejemplo, creado en una función que ha regresado desde entonces). Ejecutar gc() nunca te hará perder variables.

La cuestión de si debe llamar a gc() después de llamar a rm() , sin embargo, es buena. La documentation para gc señala amablemente:

Una llamada de gc hace que se realice una recolección de basura. Esto también se llevará a cabo automáticamente sin la intervención del usuario, y el propósito principal de llamar a gc es para el informe sobre el uso de la memoria.

Sin embargo, puede ser útil llamar a gc una vez que se ha eliminado un objeto grande, ya que esto puede hacer que R devuelva la memoria al sistema operativo.

Así que la respuesta es que puede ser bueno llamar a gc() (y al menos, no puede doler), aunque probablemente se desencadene de todos modos (si no de inmediato, luego pronto).


Personalmente, me gusta incluir gc() en los bucles para liberar algo de RAM cuando los bucles comienzan a llenar el espacio disponible. Algo como

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