Nehmen Tabellenscheiben Speicher in R auf?

8

Wenn ich ein Segment einer Tabelle verwende, sagen wir die Spaltennamen, ordnet R Speicher zu, um das Segment an einem neuen Ort zu halten? Insbesondere habe ich unter anderem eine Tabelle mit den Spalten depth1 und depth2. Ich möchte Spalten hinzufügen, die die Max und Min der beiden enthalten. Ich habe zwei Ansätze:

%Vor%

oder

%Vor%

Wenn ich keinen neuen Speicher verwende, nehme ich das Slice nur einmal, sonst würde ich die Neuzuweisung speichern. Welches ist besser? Speicherprobleme können beim Umgang mit großen Datasets kritisch sein, also lasst es bitte nicht mit der Wurzel aller bösen Meme ablehnen.

    
highBandWidth 16.03.2011, 22:38
quelle

1 Antwort

6

Ich weiß, dass dies nicht den Hauptteil der Frage beantwortet (@Hadley hat das getan und verdient einen Kredit), aber es gibt andere Optionen zu denen, die Sie vorschlagen. Hier könnten Sie pmin() und pmax() als andere Lösung verwenden, und mit with() oder within() können wir es ohne explizite Untermenge tun, um eine dd zu erstellen.

%Vor%

Wir können sehen, wie viel Kopieren mit tracemem() , aber nur erfolgt, wenn Ihr R mit der folgenden konfigurierten Option --enable-memory-profiling kompiliert wurde.

%Vor%

So sehen wir, dass R% dat zweimal während jedem within() Aufruf kopiert hat. Vergleichen Sie das mit Ihren zwei Vorschlägen:

%Vor%

Hier wird dd einmal bei jedem Aufruf nach apply kopiert, weil apply() dd vor dem Fortfahren in eine Matrix konvertiert. Die letzten drei Zeilen in jedem Block von tracemem output zeigen an, dass drei Kopien von dat erstellt wurden, um die neue Spalte einzufügen.

Was ist mit Ihrer zweiten Option?

%Vor%

Hier vermeidet diese Version die Kopie, die beim Einrichten von dd verwendet wird, ist aber in allen anderen Punkten ähnlich wie Ihr vorheriger Vorschlag.

Können wir es besser machen? Ja, und eine einfache Möglichkeit besteht darin, die Option within() zu verwenden, mit der ich begonnen habe, aber beide Anweisungen auszuführen, um neue mindepth - und maxdepth -Variablen in einem Aufruf von within() :

zu erstellen %Vor%

In dieser Version rufen wir nur zwei Kopien von dat auf, verglichen mit den 4 Kopien der ursprünglichen within() Version.

Was ist, wenn wir dat zu einer Matrix zwingen und dann die Insertionen machen?

%Vor%

Das ist eine Verbesserung, da wir nur die Kosten für die einzelne Kopie von dat aufwenden, wenn wir auf eine Matrix zugreifen. Ich habe ein bisschen geschummelt, indem ich die Methode as.matrix.data.frame() direkt aufgerufen habe. Wenn wir nur as.matrix() verwendet hätten, hätten wir eine weitere Kopie von mat erstellt.

Dies unterstreicht einen der Gründe, warum Matrizen so viel schneller zu verwenden sind als Datenrahmen.

    
Gavin Simpson 01.04.2011, 12:23
quelle