2012-01-11 13 views
39

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

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

Respuesta

57

primer lugar, es importante tener en cuenta que los dos son muy diferentes en que gc, no se elimina ningún variables que usted todavía está using- sólo se libera la memoria de los que ya no tiene acceso a (si eliminado utilizando rm() o, por ejemplo, creado en una función que ha vuelto desde entonces). Ejecutar gc() nunca hará que pierda variables.

La cuestión de si debe llamar al gc() después de llamar al rm(), sin embargo, es una buena opción. El documentation para gc amablemente notas:

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 después de eliminar 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 para llamar gc() (y, por lo menos, no puede hacer daño), a pesar de que es probable que se activa de todos modos (si no de inmediato, a continuación, en breve).

+0

Gracias por su respuesta. En términos generales, ¿se considera que la recolección automática de basura R es buena? (tan robusto como el de Java, por ejemplo) – RockScience

+0

Esa es una pregunta difícil de responder, no estoy seguro. [Esta pregunta] (http://stackoverflow.com/questions/1467201/forcing-garbage-collection-to-run-in-r-with-the-gc-command) es útil. –

+5

Generalmente no debería tener que llamar a gc, y es poco probable que haga una gran diferencia si lo hace. – hadley

-1

Personalmente, me gusta incluir gc() en loops 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() 
} 
+5

Tenga en cuenta que llamar a gc() viene con una multa de rendimiento considerable del orden de 100 ms por llamada. Entonces, en este caso, su código se ejecutará aproximadamente 100 segundos más de lo necesario :) – ThankGoat

Cuestiones relacionadas