Quelle est la différence entre gc() et rm()

Je nettoie périodiquement la mémoire dans R en utilisant un appel à rm(list=ls()).
Dois-je appeler le garbage collector gc() Après cela?

Quelle est la différence entre ces 2 fonctions? Est-ce que gc() appelle rm() pour certaines variables?

47
demandé sur Seb 2012-01-11 07:20:50

3 réponses

Tout d'abord, il est important de noter que les deux sont très différents en ce sens que gc ne supprime pas Les variables que vous utilisez toujours - cela ne libère que la mémoire pour celles auxquelles vous n'avez plus accès (qu'elles soient supprimées à l'aide de rm() ou, disons, créées dans une fonction L'exécution de gc() Ne vous fera jamais perdre des variables.

La question de savoir si vous devriez appeler gc() Après avoir appelé rm(), cependant, est une bonne question. La documentation pour gc notes utiles:

Un appel de gc provoque une collecte de place. Cela aura également lieu automatiquement sans intervention de l'utilisateur, et le but principal de l'appel gc est pour le rapport sur l'utilisation de la mémoire.

Cependant, il peut être utile d'appeler gc après la suppression d'un objet volumineux, car cela peut inciter R à retourner la mémoire au système d'exploitation.

Donc, la réponse est qu'il peut être bon d'appeler gc() (et à tout le moins, ne peut pas faire de mal), même bien qu'il serait probablement déclenché de toute façon (sinon tout de suite, puis bientôt).

64
répondu David Robinson 2012-01-11 07:29:50

Personnellement, j'aime inclure le gc() dans les boucles pour libérer de la RAM lorsque les boucles commencent à remplir l'espace disponible. Quelque chose comme

for(i in 1:1000){
res[[i]] = some operation
gc()
}
0
répondu Gabriel123 2017-09-07 15:55:51

Re commentaire de ThankGoat sur la pénalité gc, bien que cela soit vrai, on pourrait bien sûr décider d'appeler gc toutes les n itérations dans une boucle (où N peut être paramétré de plusieurs façons). Pour les boucles où le nombre d'itérations est important, mais l'utilisation des ressources dans une itération donnée est plus modeste, il peut ne pas être nécessaire de faire GC chaque itération afin de retrouver les performances souhaitées.

Bien sûr, si vous bouclez avec un très grand nombre d'itérations d'utilisation très élevées, c'est un histoire différente, mais à ce stade, il se peut que le code ait simplement besoin d'être vectorisé et / ou peut-être même écrit dans une autre langue.

0
répondu Pascoe 2018-08-17 14:01:41