72 votes

Forcer la récupération de place à s'exécuter en R avec la commande gc ()

Périodiquement je programme sans soin. Ok, je programme sans soin tout le temps, mais parfois, cela se rattrape avec moi sous la forme de la mémoire des erreurs. J'ai commencer à exercer un peu de discipline dans la suppression d'objets avec la rm() de commande et les choses s'améliorent. Je vois des messages contradictoires en ligne pour savoir si je dois appeler explicitement gc() après la suppression d'objets de données volumineux. Certains disent qu'avant de R renvoie une erreur de mémoire, il sera exécuté gc() alors que d'autres disent que forcer manuellement gc est une bonne idée.

Dois-je exécuter gc() après la suppression d'objets volumineux afin d'assurer un maximum de mémoire de la disponibilité?

51voto

Dirk Eddelbuettel Points 134700

"Sans doute." Je le fais aussi, et souvent même dans une boucle comme dans

cleanMem <- function(n=10) { for (i in 1:n) gc() }

Pourtant, qui n'a pas, dans mon expérience, la restauration de la mémoire à un état primitif.

Donc, ce que j'ai l'habitude de le faire est de garder les tâches à la main dans les fichiers de script et l'exécuter ceux qui utilisent le " r "frontend (sur Unix, et de la" littler package). Rscript est une alternative sur d'autres OS.

Ce flux de travail arrive à être d'accord avec

qui nous avons couvert ici avant.

24voto

Richie Cotton Points 35365

À partir de la page d'aide sur gc:

Un appel à " gc " provoque une poubelle la collecte de prendre place. Ce sera également lieu automatiquement sans l'intervention de l'utilisateur, et le principal le but de l'appel à 'gc' est pour la rapport sur l'utilisation de la mémoire.

Cependant, il peut être utile d'appeler 'gc' après un grand objet a été retiré, comme cela peut l'invite de R pour le retour de la mémoire pour le système d'exploitation.

De sorte qu'il peut être utile de le faire, mais surtout, vous ne devriez pas avoir à. Mon opinion personnelle est que c'est le code de dernier recours, vous ne devriez pas être jonchent votre code avec gc() des déclarations comme une question de cours, mais si votre machine ne cesse de tomber dessus, et vous avez essayé tout le reste, alors il pourrait être utile.

Par tout le reste, je veux dire des choses comme

  1. L'écriture de fonctions plutôt que brut de scripts, de sorte que les variables hors de portée.

  2. La vidange de votre espace de travail si vous passez d'un problème à un autre un seul.

  3. Supprimant des données et variables qui ne vous intéresse pas. (J'ai souvent recevoir des feuilles de calcul avec des dizaines de inintéressant colonnes.)

14voto

Tommy Points 16323

Un peu en retard à la fête, mais:

Appelant explicitement gc libérera de la mémoire "maintenant". ...donc si d'autres processus ont besoin de la mémoire, il pourrait être une bonne idée. Par exemple, avant d'appeler system ou similaire. Ou peut-être lorsque vous avez "fait" avec le script et R sera assis inactif pendant un certain temps jusqu'à ce que le travail suivant arrive de nouveau, de sorte que d'autres procédés obtenir plus de mémoire.

Si vous voulez que votre script à exécuter plus rapidement, il n'a pas d'importance puisque R appellera plus tard si il en a besoin. Il pourrait même être plus lent depuis le normal GC cycle pourriez ne jamais avoir besoin de l'appeler.

...mais si vous voulez mesurer le temps, par exemple, il est généralement une bonne idée de faire une table avant de lancer votre test. C'est ce qu' system.time le fait par défaut.

Mise à JOUR Comme @DWin souligne, R (ou C# ou Java, etc) ne savent pas toujours quand la mémoire est faible et que le GC a besoin pour fonctionner. Donc, vous pourriez parfois le besoin de faire du GC pour contourner les carences dans le système de mémoire.

14voto

BondedDust Points 105234

Soi-disant R utilise uniquement la RAM. Ce n'est pas vrai sur un Mac (et je soupçonne que c'est pas vrai sur Windows.) Si elle est à court de RAM, il va commencer à utiliser la mémoire virtuelle. Parfois, mais pas toujours, des processus "reconnaître" que dont ils ont besoin pour exécuter gc() et libérer de la mémoire. Quand ils ne le font pas, vous pouvez voir ce à l'aide de la ActivityMonitor.app, et de voir que toute la RAM est occupée accès au disque et a sauté vers le haut. Je trouve que lorsque je suis en train de faire de grandes de régression de Cox pistes que je peux éviter de la renverser dans la mémoire virtuelle (avec la lenteur d'accès au disque) par des appels précédents avec gc(); cph(...)

11voto

hadley Points 33766

Non. S'il n'y a pas assez de mémoire disponible pour une opération, R exécutera automatiquement gc() .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X