Je nettoie périodiquement la mémoire dans R en utilisant un appel à rm(list=ls())
.
Dois-je appeler le récupérateur de place gc()
après cela?
Quelle est la différence entre ces 2 fonctions? Est-ce que gc()
appelle rm()
pour certaines variables?
Tout d’abord, il est important de noter que les deux sont très différentes en ce que gc
ne supprime pas les variables les que vous utilisez encore - elle ne libère la mémoire que pour celles auxquelles vous n’avez plus accès (qu'elles aient été supprimées avec rm()
ou, par exemple, créé dans une fonction retournée depuis). Lancer gc()
ne vous fera jamais perdre de variables.
La question de savoir si vous devez appeler gc()
après avoir appelé rm()
, cependant, est bonne. La documentation for gc indique utilement:
Un appel de gc provoque une récupération de place. Cela se fera également automatiquement sans intervention de l'utilisateur, et l'appel à gc a pour objectif principal de générer un rapport sur l'utilisation de la mémoire.
Toutefois, il peut être utile d'appeler gc après la suppression d'un objet volumineux, car cela peut inciter R à restituer de la mémoire au système d'exploitation.
La réponse est donc qu'il peut être bon d'appeler gc()
(et à tout le moins, ça ne peut pas faire de mal), même si cela risquerait de se déclencher de toute façon (si ce n'est tout de suite, sinon bientôt).
Personnellement, j'aime bien inclure la gc()
dans les boucles pour libérer un peu de RAM quand les boucles commencent à remplir l'espace disponible. Quelque chose comme
for(i in 1:1000){
res[[i]] = some operation
gc()
}
Pour ce qui est du commentaire de ThankGoat sur la pénalité de gc, bien que cela soit vrai, on pourrait bien sûr décider d'appeler gc toutes les N itérations d'une boucle (N pouvant être paramétré de plusieurs façons). Pour les boucles où le nombre d'itérations est grand, mais où l'utilisation des ressources au sein d'une itération donnée est plus modeste, il n'est peut-être pas nécessaire de faire du GC à chaque itération pour retrouver les performances souhaitées.
Bien sûr, si vous parcourez un très grand nombre d'itérations d'utilisation très élevée, c'est une autre histoire, mais à ce stade, il se peut que le code doive simplement être vectorisé et/ou même écrit dans une autre langue. .