Quelle est la meilleure façon d'éviter de passer une trame de données autour?

StackOverflow https://stackoverflow.com/questions/596819

  •  09-09-2019
  •  | 
  •  

Question

Je 12 data.frames pour travailler avec. Ils sont semblables et je dois faire le même traitement à chacun, j'ai donc écrit une fonction qui prend une data.frame, traite, puis renvoie un data.frame. Cela marche. Mais je crains que je passe autour d'une structure très grande. Je formulerai des copies temporaires (suis-je?) Cela ne peut pas être efficace. Quelle est la meilleure façon d'éviter le passage d'un data.frame autour?

doSomething <- function(df) {
  // do something with the data frame, df
  return(df)
}
Était-ce utile?

La solution

Vous êtes, en effet, en passant l'objet autour et à l'aide de la mémoire. Mais je ne pense pas que vous pouvez faire une opération sur un objet en R sans passer l'objet autour. Même si vous n'avez pas créé une fonction et ce que vos opérations en dehors de la fonction, R se comporte essentiellement les mêmes.

La meilleure façon de voir est de mettre en place un exemple. Si vous êtes sous Windows ouvrez le Gestionnaire des tâches de Windows. Si vous êtes sous Linux ouvrir une fenêtre de terminal et exécutez la commande supérieure. Je vais supposer que Windows dans cet exemple. Dans R exécutez la commande suivante:

col1<-rnorm(1000000,0,1)
col2<-rnorm(1000000,1,2)
myframe<-data.frame(col1,col2)

rm(col1)
rm(col2)
gc()

ce qui crée un couple de vecteurs appelés col1 et col2 les combine ensuite dans une trame de données appelé MyFrame. Il tombe alors la collecte des ordures et des vecteurs forces pour exécuter. Regardez dans votre gestionnaire de fenêtres de tâches à la mem utilisation de la tâche Rgui.exe. Quand je commence R utilise environ 19 meg de mem. Après avoir couru les commandes ci-dessus ma machine utilise un peu moins de 35 meg pour R.

Maintenant, essayez ceci:

myframe<-myframe+1

votre utilisation de la mémoire R devrait passer à plus de 144 meg. Si vous forcez la collecte des ordures à l'aide gc () vous le verrez retomber à environ 35 meg. Pour essayer cette aide d'une fonction, vous pouvez faire ce qui suit:

doSomething <- function(df) {
    df<-df+1-1
return(df)
}
myframe<-doSomething(myframe)

lorsque vous exécutez le code ci-dessus, l'utilisation de la mémoire va sauter jusqu'à 160 meg environ. Exécution gc () baissera de nouveau à 35 meg.

Alors, que faire de tout cela? Eh bien, faire une opération en dehors d'une fonction est pas beaucoup plus efficace (en termes de mémoire) que de le faire dans une fonction. Collecte des ordures ménagères nettoie les choses vraiment bien. Si vous forcer gc () à courir? Probablement pas car il fonctionnera automatiquement au besoin, je viens couru ci-dessus pour montrer son impact sur l'utilisation de la mémoire.

J'espère que cela!

Autres conseils

Je ne suis pas expert en R, mais la plupart des langues utilisent un système de comptage de référence pour les grands objets. Une copie des données d'objet ne sera pas fait jusqu'à ce que vous modifiez la copie de l'objet. Si vos fonctions ne lisent les données (à savoir pour l'analyse), aucune copie doit être faite.

Je suis tombé sur cette question à la recherche de quelque chose d'autre, et il est vieux - donc je vais simplement fournir une brève réponse pour l'instant (laisser un commentaire si vous souhaitez plus d'explications)

.

Vous pouvez passer autour des environnements dans R qui contiennent partout de 1 à toutes vos variables. Mais probablement vous n'avez pas besoin de vous inquiéter à ce sujet.

[Vous pourriez également être en mesure de faire quelque chose de similaire avec des classes. Je ne comprends actuellement comment utiliser les classes pour les fonctions polymorphes -. Et je note qu'il ya plus de 1 système de classe coups de pied autour]

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top