Welche Tricks verwenden die Leute, um den verfügbaren Speicher einer interaktiven R-Sitzung zu verwalten? Ich verwende die folgenden Funktionen [basierend auf Postings von Petr Pikal und David Hinds in der r-help-Liste im Jahr 2004], um die größten Objekte aufzulisten (und/oder zu sortieren) und um gelegentlich rm()
einige von ihnen. Aber die bei weitem effektivste Lösung war ... unter 64-Bit-Linux mit reichlich Speicher zu laufen.
Gibt es noch andere nette Tricks, die Sie uns mitteilen möchten? Einen pro Beitrag, bitte.
# 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 Stimmen
Wohlgemerkt, ich zweifle NICHT daran, aber was nützt das schon? Ich bin ziemlich neu bei Speicherproblemen in R, aber ich erlebe einige in letzter Zeit (das ist, warum ich für diesen Beitrag gesucht:) - so bin ich gerade erst anfangen mit all dies. Wie hilft mir das bei meiner täglichen Arbeit?
5 Stimmen
Wenn Sie die Objekte innerhalb einer Funktion sehen wollen, müssen Sie lsos(pos = environment()) verwenden, sonst werden nur globale Variablen angezeigt. Um in den Standardfehler zu schreiben: write.table(lsos(pos=environment()), stderr(), quote=FALSE, sep=' \t ')
0 Stimmen
Warum 64-Bit-Linux und nicht 64-Bit-Windows? Macht die Wahl des Betriebssystems einen nicht-trivialen Unterschied, wenn ich 32 GB Arbeitsspeicher zur Verfügung habe?
0 Stimmen
Ja, das funktioniert natürlich, und es wird auch unter Windows verwendet. Es gibt nichts Betriebssystem-spezifisches hier (oder in den meisten anderen R-Code).
0 Stimmen
@Jase: Der ursprüngliche Beitrag wurde zu einer Zeit geschrieben, als noch nicht viele Leute ein 64-Bit-Windows-Betriebssystem verwendeten (erinnern Sie sich, wie glücklich die Leute mit Vista waren?), und noch weniger von ihnen hatten ihre MB-Speichersteckplätze ausgeschöpft. Macs konnten zu dieser Zeit nur bis zu 32 GB aufnehmen.
0 Stimmen
Dies ist eine großartige Funktion. Aber wenn ich meinen Arbeitsbereich leeren möchte und dies mit "rm(list=ls())" tue, dann verliere ich diese Funktion. Gibt es eine Möglichkeit, zu verhindern, dass einige Dinge mit einem allgemeinen Befehl wie diesem gelöscht werden?
0 Stimmen
Ich kenne keinen erfahrenen R-Programmierer, der sich für eine
rm(list=ls())
. Aber Sie haben die Antwort schon parat: Schreiben Sie einen Filter, der diese (oder jede andere "heilige") Funktion aus der Liste entfernt, die anrm()
.3 Stimmen
@pepsimax: Dies wurde verpackt in der
multilevelPSA
Paket . Das Paket ist für etwas anderes gedacht, aber Sie können die Funktion von dort aus verwenden, ohne das Paket zu laden, indem Sie sagenrequireNamespace(multilevelPSA); multilevelPSA::lsos(...)
. Oder in derDmisc
Paket (nicht auf CRAN).0 Stimmen
Hallo Dirk, ich frage mich nur, warum hast du die
as.character()
umclass(x)
enobj.class <- napply(names, function(x) as.character(class(x))[1])
. Gibt es etwas, das ich nicht weiß, dachte ich.class(x)
gibt immer einen Zeichenvektor zurück0 Stimmen
Es ist ein fünfjährig SO Beitrag basierend auf einer elfjährig r-help E-Mail.
2 Stimmen
Wenn der Datensatz eine überschaubare Größe hat, gehe ich normalerweise zu R-Studio>Umgebung>Gitteransicht. Hier können Sie alle Elemente in Ihrer aktuellen Umgebung anhand der Größe sehen und sortieren.