Effacer la mémoire en R

Gustavo du Mortier 21 février 2021
Effacer la mémoire en R

Après avoir travaillé avec des scripts R pendant un certain temps, l’environnement R peut accumuler beaucoup de données en mémoire, retenant ainsi une partie importante des ressources de l’ordinateur. Cette situation peut aboutir à ce que le système R refuse d’exécuter du code parce qu’il ne peut plus allouer de mémoire. Même si vous redémarrez votre environnement R, il peut arriver que la mémoire ne soit pas libérée.

La commande rm(list=ls()) est censée libérer la mémoire utilisée par tous les objets, mais ce qu’elle fait réellement est de détruire les pointeurs vers les morceaux de mémoire utilisés. Le problème est que ces morceaux de mémoire ne sont pas immédiatement libérés pour être utilisés par de nouvelles tâches.

Effacer la mémoire dans R avec la fonction gc

Le processus de collecte des déchets s’exécute automatiquement et périodiquement dans R, mais parfois il ne fonctionne pas au moment précis où vous avez besoin de beaucoup de mémoire pour une opération de données importante. Dans une telle situation, il pourrait être utile d’appeler la fonction gc() pour effacer la mémoire dans R.

Le but principal de gc() est de montrer un rapport sur l’utilisation de la mémoire. Comme effet secondaire, l’appel de gc() déclenche le processus de collecte des déchets, en effaçant la mémoire. Par conséquent, comme le note la documentation gc, il est bon d’appeler gc() après qu’un objet volumineux ait été supprimé, car cette action incite R à libérer la mémoire qu’il n’utilise plus.

Vous pouvez également insérer un appel à gc() dans une boucle pour lancer de manière répétée le processus de collecte des déchets. Il faut juste prendre en compte que ce processus prend un certain temps de l’ordre de 100 ms par appel, il n’est donc pas recommandé de le placer dans une boucle très répétitive ou une boucle avec un nombre élevé d’itérations.

Si vous utilisez Windows, vous pouvez appeler la fonction memory.size() avec le paramètre max=T pour indiquer la quantité de mémoire accessible par le système d’exploitation, ou avec max=F pour indiquer la quantité de mémoire utilisée à tout moment. La documentation R explique d’autres aspects de la fonction memory.size().

Pour montrer comment la consommation de mémoire varie lorsque vous créez et détruisez de gros objets de données, nous pouvons exécuter le code suivant dans Windows qui crée un échantillon de vecteur avec 100 000 éléments, supprime le vecteur, et enfin effectue un ramassage des déchets. Entre chaque instruction, nous pouvons vérifier la quantité de mémoire utilisée en exécutant la fonction memory.size avec le paramètre max=F.

memory.size (max = F)

Production :

[1] 32.6

Ces 32,6 Mo représentent la quantité minimale de mémoire utilisée par R.

my_data <- sample (1:100000)
memory.size (max = F)

Production :

[1] 33.75

Nous pouvons voir que l’échantillon de données créé consomme environ 1 MB de mémoire puisque la mémoire utilisée rapportée par la fonction memory.size a augmenté de 1.

rm (my_data)
memory.size (max = F)

Production :

[1] 33.75

Même si nous avons retiré l’objet, la mémoire semble toujours être occupée.

gc()

Production :

         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)

Production :

[1] 32.6

Les quantités de mémoire seront différentes pour chaque ordinateur, mais vous pouvez voir que la quantité de mémoire libre rapportée par memory.size reste la même après l’exécution de l’instruction rm (my_data) et qu’elle ne revient à la valeur initiale de 32,6 Mo qu’après l’exécution de l’instruction gc() et que la mémoire est effectivement libérée.