Limpar memória em R
Depois de trabalhar com scripts R por um tempo, o ambiente R pode acumular muitos dados na memória, retendo partes significativas dos recursos do computador. Essa situação pode terminar com o sistema R se recusando a executar o código porque não pode alocar mais memória. Mesmo se você reiniciar seu ambiente R, pode acontecer que a memória não seja liberada.
Espera-se que o comando rm(list=ls())
libere a memória usada por todos os objetos, mas o que ele realmente faz é destruir os ponteiros para os pedaços de memória usados. O problema é que esses pedaços de memória não são liberados imediatamente para uso em novas tarefas.
Limpar memória em R com a função gc
O processo de coleta de lixo é executado automaticamente e periodicamente no R, mas às vezes não é executado no momento preciso em que você precisa de muita memória para alguma operação de big data. Em tal situação, pode ser útil chamar a função gc()
para limpar a memória em R.
O objetivo principal de gc()
é mostrar um relatório sobre o uso de memória. Como efeito colateral, chamar gc()
aciona o processo de coleta de lixo, limpando a memória. Portanto, como a documentação gc
observa, é uma boa idéia chamar gc()
depois que um objeto grande foi removido, uma vez que esta ação solicita que R libere a memória que não usa mais.
Você também pode inserir uma chamada para gc()
em um loop para executar repetidamente o processo de coleta de lixo. Basta levar em conta que este processo leva algum tempo da ordem de 100ms por chamada, por isso não é recomendado colocá-lo dentro de um loop altamente repetitivo ou com um grande número de iterações.
Se você usar o Windows, você pode chamar a função memory.size()
com o parâmetro max=T
para mostrar a quantidade de memória acessível pelo sistema operacional, ou com max=F
para mostrar quanta memória há sendo usado a qualquer momento. A documentação R explica outros aspectos da função memory.size()
.
Para mostrar como o consumo de memória varia quando você cria e destrói objetos de big data, podemos executar o seguinte código no Windows que cria um vetor de amostra com 100.000 elementos, remove o vetor e, finalmente, executa uma coleta de lixo. Entre cada instrução, podemos verificar quanta memória é usada executando a função memory.size
com o parâmetro max=F
.
memory.size (max = F)
Resultado:
[1] 32.6
Esses 32,6 MB representam a quantidade mínima de memória usada por R.
my_data <- sample (1:100000)
memory.size (max = F)
Resultado:
[1] 33.75
Podemos ver que os dados de amostra criados consomem aproximadamente 1 MB de memória, pois a memória usada relatada pela função memory.size
aumentou em 1.
rm (my_data)
memory.size (max = F)
Resultado:
[1] 33.75
Mesmo tendo removido o objeto, a memória parece ainda estar ocupada.
gc()
Resultado:
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)
Resultado:
[1] 32.6
As quantidades de memória serão diferentes para cada computador, mas você pode ver que a quantidade de memória livre relatada por memory.size
permanece a mesma após a execução da instrução rm (my_data)
e que só retorna ao valor inicial de 32,6 MB depois que a instrução gc()
é executada e a memória é efetivamente liberada.