Quelles astuces utilise-t-on pour gérer la mémoire disponible d'une session R interactive ? J'utilise les fonctions ci-dessous [basées sur les messages de Petr Pikal et David Hinds sur la liste r-help en 2004] pour lister (et/ou trier) les plus gros objets et pour occasionnellement rm()
certains d'entre eux. Mais la solution de loin la plus efficace était ... de fonctionner sous Linux 64 bits avec beaucoup de mémoire.
D'autres trucs sympas que vous voulez partager ? Un par poste, s'il vous plaît.
# improved list of objects
.ls.objects <- function (pos = 1, pattern, order.by,
decreasing=FALSE, head=FALSE, n=5) {
napply <- function(names, fn) sapply(names, function(x)
fn(get(x, pos = pos)))
names <- ls(pos = pos, pattern = pattern)
obj.class <- napply(names, function(x) as.character(class(x))[1])
obj.mode <- napply(names, mode)
obj.type <- ifelse(is.na(obj.class), obj.mode, obj.class)
obj.size <- napply(names, object.size)
obj.dim <- t(napply(names, function(x)
as.numeric(dim(x))[1:2]))
vec <- is.na(obj.dim)[, 1] & (obj.type != "function")
obj.dim[vec, 1] <- napply(names, length)[vec]
out <- data.frame(obj.type, obj.size, obj.dim)
names(out) <- c("Type", "Size", "Rows", "Columns")
if (!missing(order.by))
out <- out[order(out[[order.by]], decreasing=decreasing), ]
if (head)
out <- head(out, n)
out
}
# shorthand
lsos <- function(..., n=10) {
.ls.objects(..., order.by="Size", decreasing=TRUE, head=TRUE, n=n)
}
1 votes
Remarque, je n'en doute PAS, mais à quoi bon ? Je suis assez novice en ce qui concerne les problèmes de mémoire dans R, mais j'en rencontre quelques-uns ces derniers temps (c'est pourquoi je cherchais ce post :) - donc je ne fais que commencer avec tout ça. En quoi cela aide-t-il mon travail quotidien ?
5 votes
Si vous voulez voir les objets à l'intérieur d'une fonction, vous devez utiliser : lsos(pos = environment()), sinon il ne montrera que les variables globales. Pour écrire dans l'erreur standard : write.table(lsos(pos=environnement()), stderr(), quote=FALSE, sep=' \t ')
0 votes
Pourquoi linux 64 bits et pas Windows 64 bits ? Le choix du système d'exploitation fait-il une différence non négligeable lorsque j'ai 32 Go de RAM à utiliser ?
0 votes
Oui, cela fonctionnera bien sûr, et les gens l'utilisent sous Windows. Il n'y a rien de spécifique au système d'exploitation ici (ou dans la plupart des autres codes R).
0 votes
@Jase : Le message original a été écrit à une époque où peu de personnes utilisaient un système d'exploitation Windows 64 bits (vous vous souvenez combien les gens étaient heureux avec Vista ?), et encore moins de personnes avaient maximisé leurs emplacements mémoire en Mo. Les Macs de l'époque ne pouvaient aller que jusqu'à 32 Go.
0 votes
C'est une excellente fonction. Mais si je veux vider mon espace de travail et que je le fais avec "rm(list=ls())", je perds cette fonction. Existe-t-il un moyen d'empêcher la suppression de certains éléments avec une commande générique comme celle-ci ?
0 votes
Je ne connais pas de programmeur R expérimenté qui soit en faveur de
rm(list=ls())
. Mais vous avez votre réponse juste là : écrivez un filtre qui supprime cette fonction (ou toute autre fonction "sacrée") de la liste alimentée àrm()
.3 votes
@pepsimax : Ceci a été emballé dans le
multilevelPSA
paquet . Le paquet est conçu pour autre chose, mais vous pouvez utiliser la fonction à partir de là sans charger le paquet en disantrequireNamespace(multilevelPSA); multilevelPSA::lsos(...)
. Ou dans leDmisc
paquet (pas sur CRAN).0 votes
Salut Dirk, je me demandais juste... pourquoi tu as utilisé
as.character()
autour declass(x)
enobj.class <- napply(names, function(x) as.character(class(x))[1])
. Y a-t-il quelque chose dont je ne suis pas conscient, j'ai penséclass(x)
renvoie toujours un vecteur de caractères0 votes
Il s'agit d'un de cinq ans SO post basé sur un onze ans r-help email.
2 votes
Si l'ensemble de données est d'une taille gérable, je vais généralement dans R studio>Environment>Grid View. Ici, vous pouvez voir et trier tous les éléments de votre environnement actuel en fonction de leur taille.