Limpar memória em R

Gustavo du Mortier 30 março 2021
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.