Bearbeiten: Tippfehler behoben - Danke Dirk.
(Verspätete Antwort, aber ich begann damit, SO ein Jahr nach der Veröffentlichung dieser Frage zu verwenden.)
Dies ist die Grundidee hinter Memoization (oder Memoisierung). Ich habe eine lange Liste von Vorschlägen, insbesondere die Pakete read.csv
und reshape
, in dieser Abfrage .
Sie können auch das Checkpointing nutzen, das ebenfalls als Teil derselben Liste behandelt wird.
Ich denke, dass Ihr Anwendungsfall meine zweite spiegelt: "Memoisierung von monströsen Berechnungen". :)
Ein anderer Trick, den ich benutze, besteht darin, eine Menge speicherbarer Dateien zu erstellen, die ich oft benutze, um Daten zu speichern. Das Schöne daran ist, dass mehrere R-Instanzen auf gemeinsam genutzte Daten zugreifen können, so dass viele Instanzen bei dem gleichen Problem knacken können.
Ich möchte das auch tun, wenn ich Sweave benutze. Ich würde vorschlagen, alle Ihre teuren Funktionen (Laden und Umformen von Daten) am Anfang Ihres Codes. Führen Sie den Code aus und speichern Sie den Arbeitsbereich. Dann kommentieren Sie die teuren Funktionen und laden Sie die Workspace-Datei mit %code% . Dies ist natürlich risikoreicher, wenn Sie unerwünschte Änderungen an der Arbeitsbereichsdatei vornehmen, aber in diesem Fall haben Sie immer noch den Code in Kommentaren, wenn Sie von vorne anfangen möchten.
Ohne zu sehr ins Detail zu gehen, folge ich normalerweise einem von drei Ansätzen:
Einige einfache Möglichkeiten sind mit einigen Kombinationen von
machbarEs gibt auch Caching-Pakete auf CRAN, die nützlich sein können.
Nachdem Sie etwas getan haben, das Sie als kostspielig erachten, speichern Sie die Ergebnisse dieses kostspieligen Schritts in einer R-Datendatei.
Wenn Sie zum Beispiel einen csv in einen Datenrahmen namens %code% geladen und dann zusammenfassende Statistiken aus diesem Datenrahmen in ein df mit dem Namen %code% erstellt haben, können Sie Folgendes tun:
%Vor%Die Option zum Komprimieren ist optional und wird verwendet, wenn Sie die Datei, die auf den Datenträger geschrieben wird, komprimieren möchten. Weitere Informationen finden Sie in %code% .
Nachdem Sie die RData-Datei gespeichert haben, können Sie die langsamen Datenlade- und -zusammenfassungsschritte sowie den Speicherschritt auskommentieren und die Daten einfach wie folgt laden:
%Vor%Diese Antwort ist nicht vom Editor abhängig. Es funktioniert genauso für Emacs, TextMate, etc. Sie können an jedem Ort auf Ihrem Computer speichern. Ich empfehle jedoch, den langsamen Code in Ihrer R-Skriptdatei zu behalten, damit Sie immer wissen können, woher Ihre RData-Datei kam, und sie bei Bedarf aus den Quelldaten neu erstellen zu können.
Einige einfache Möglichkeiten sind mit einigen Kombinationen von
machbarexists("foo")
, um zu testen, ob eine Variable existiert, andernfalls neu laden oder neu berechnen file.info("foo.Rd")$ctime
, die Sie mit Sys.time()
vergleichen können, um zu sehen, ob sie neuer ist als eine bestimmte Zeit, die Sie laden können, andernfalls recompute. Es gibt auch Caching-Pakete auf CRAN, die nützlich sein können.
Nachdem Sie etwas getan haben, das Sie als kostspielig erachten, speichern Sie die Ergebnisse dieses kostspieligen Schritts in einer R-Datendatei.
Wenn Sie zum Beispiel einen csv in einen Datenrahmen namens myVeryLargeDataFrame
geladen und dann zusammenfassende Statistiken aus diesem Datenrahmen in ein df mit dem Namen VLDFSummary
erstellt haben, können Sie Folgendes tun:
Die Option zum Komprimieren ist optional und wird verwendet, wenn Sie die Datei, die auf den Datenträger geschrieben wird, komprimieren möchten. Weitere Informationen finden Sie in ?save
.
Nachdem Sie die RData-Datei gespeichert haben, können Sie die langsamen Datenlade- und -zusammenfassungsschritte sowie den Speicherschritt auskommentieren und die Daten einfach wie folgt laden:
%Vor%Diese Antwort ist nicht vom Editor abhängig. Es funktioniert genauso für Emacs, TextMate, etc. Sie können an jedem Ort auf Ihrem Computer speichern. Ich empfehle jedoch, den langsamen Code in Ihrer R-Skriptdatei zu behalten, damit Sie immer wissen können, woher Ihre RData-Datei kam, und sie bei Bedarf aus den Quelldaten neu erstellen zu können.
(Verspätete Antwort, aber ich begann damit, SO ein Jahr nach der Veröffentlichung dieser Frage zu verwenden.)
Dies ist die Grundidee hinter Memoization (oder Memoisierung). Ich habe eine lange Liste von Vorschlägen, insbesondere die Pakete memoise
und R.cache
, in dieser Abfrage .
Sie können auch das Checkpointing nutzen, das ebenfalls als Teil derselben Liste behandelt wird.
Ich denke, dass Ihr Anwendungsfall meine zweite spiegelt: "Memoisierung von monströsen Berechnungen". :)
Ein anderer Trick, den ich benutze, besteht darin, eine Menge speicherbarer Dateien zu erstellen, die ich oft benutze, um Daten zu speichern. Das Schöne daran ist, dass mehrere R-Instanzen auf gemeinsam genutzte Daten zugreifen können, so dass viele Instanzen bei dem gleichen Problem knacken können.
Ich möchte das auch tun, wenn ich Sweave benutze. Ich würde vorschlagen, alle Ihre teuren Funktionen (Laden und Umformen von Daten) am Anfang Ihres Codes. Führen Sie den Code aus und speichern Sie den Arbeitsbereich. Dann kommentieren Sie die teuren Funktionen und laden Sie die Workspace-Datei mit load()
. Dies ist natürlich risikoreicher, wenn Sie unerwünschte Änderungen an der Arbeitsbereichsdatei vornehmen, aber in diesem Fall haben Sie immer noch den Code in Kommentaren, wenn Sie von vorne anfangen möchten.
Ohne zu sehr ins Detail zu gehen, folge ich normalerweise einem von drei Ansätzen:
assign
, um während der gesamten Ausführung für jedes wichtige Objekt einen eindeutigen Namen zuzuweisen. Fügen Sie dann am Anfang jeder Funktion ein if(exists(...)) get(...)
ein, um den Wert zu erhalten, oder berechnen Sie ihn neu. (wie Dirks Vorschlag) cacheSweave
mit meinen Sweave
Dokumenten. Dies erledigt die ganze Arbeit für Sie Caching Berechnungen und ruft sie automatisch ab. Es ist wirklich einfach zu benutzen: Benutze einfach den cacheSweave Treiber und füge dieses Flag jedem Block hinzu: <<..., cache=true>>=
save
und load
, um die Umgebung in entscheidenden Momenten zu speichern und stellen Sie dabei sicher, dass alle Namen eindeutig sind.