Borrar la memoria en R
Después de trabajar con scripts de R durante un tiempo, el entorno de R puede acumular muchos datos en memoria, reteniendo partes significativas de los recursos del ordenador. Esta situación puede acabar con el sistema R negándose a ejecutar código porque no puede asignar más memoria. Incluso si se reinicia el entorno de R, puede ocurrir que la memoria no se libere.
Se espera que el comando rm(list=ls())
libere la memoria utilizada por todos los objetos, pero lo que realmente hace es destruir los punteros a los trozos de memoria utilizados. El problema es que esos trozos de memoria no se liberan inmediatamente para ser utilizados por nuevas tareas.
Limpiar la memoria en R con la función gc
El proceso de recolección de basura se ejecuta automática y periódicamente dentro de R, pero a veces no se ejecuta en el momento preciso en que se necesita mucha memoria para alguna operación de big data. En tal situación, podría ser útil llamar a la función gc()
para limpiar la memoria en R.
El propósito principal de gc()
es mostrar un informe sobre el uso de la memoria. Como efecto secundario, llamar a gc()
desencadena el proceso de recolección de basura, limpiando la memoria. Por lo tanto, como señala la documentación de gc
, es una buena idea llamar a gc()
después de que se haya eliminado un objeto grande, ya que esta acción hace que R libere la memoria que ya no utiliza.
También puede insertar una llamada a gc()
dentro de un bucle para ejecutar repetidamente el proceso de recogida de basura. Sólo hay que tener en cuenta que este proceso lleva un tiempo del orden de 100ms por llamada, por lo que no es recomendable colocarlo dentro de un bucle muy repetitivo o con un número elevado de iteraciones.
Si utiliza Windows, puede llamar a la función memory.size()
con el parámetro max=T
para mostrar la cantidad de memoria accesible por el sistema operativo, o con max=F
para mostrar cuánta memoria se está utilizando en cada momento. La documentación de R explica otros aspectos de la función memory.size()
.
Para mostrar cómo varía el consumo de memoria cuando se crean y destruyen objetos de big data, podemos ejecutar el siguiente código en Windows que crea un vector de muestra con 100.000 elementos, elimina el vector y, finalmente, realiza una recolección de basura. Entre cada instrucción, podemos comprobar cuánta memoria se utiliza ejecutando la función memory.size
con el parámetro max=F
.
memory.size (max = F)
Resultado:
[1] 32.6
Estos 32,6 MB representan la cantidad mínima de memoria utilizada por R.
my_data <- sample (1:100000)
memory.size (max = F)
Resultado:
[1] 33.75
Podemos ver que los datos de muestra creados consumen aproximadamente 1 MB de memoria ya que la memoria utilizada reportada por la función memory.size
se incrementó en 1.
rm (my_data)
memory.size (max = F)
Resultado:
[1] 33.75
Aunque hemos eliminado el objeto, la memoria parece seguir ocupada.
gc()
Producción :
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)
Producción :
[1] 32.6
Las cantidades de memoria serán diferentes para cada ordenador, pero se puede ver que la cantidad de memoria libre reportada por memory.size
sigue siendo la misma después de ejecutar la instrucción rm (my_data)
y que sólo vuelve al valor inicial de 32.6 MB después de ejecutar la instrucción gc()
y la memoria se libera efectivamente.