web-dev-qa-db-fra.com

Quelle est la difference entre gc () et rm ()

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?

52
RockScience

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).

68
David Robinson

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()
}
0
Gabriel123

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. .

0
Pascoe