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.
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.
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.
So sehen wir, dass R% dat
zweimal während jedem within()
Aufruf kopiert hat. Vergleichen Sie das mit Ihren zwei Vorschlägen:
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()
:
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?
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.
Tags und Links optimization r memory-management premature-optimization