Cache teure Operationen in R

8
___ answer3347517 ___
%Vor%

Bearbeiten: Tippfehler behoben - Danke Dirk.

    
___ answer7961639 ___

(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.

    
___ answer3347415 ___

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.

    
___ answer3347505 ___

Ohne zu sehr ins Detail zu gehen, folge ich normalerweise einem von drei Ansätzen:

  1. Verwenden Sie %code% , 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 %code% ein, um den Wert zu erhalten, oder berechnen Sie ihn neu. (wie Dirks Vorschlag)
  2. Verwenden Sie %code% mit meinen %code% 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: %code%
  3. Verwenden Sie %code% und %code% , um die Umgebung in entscheidenden Momenten zu speichern und stellen Sie dabei sicher, dass alle Namen eindeutig sind.
___ tag123r ___ R ist eine freie, Open-Source-Programmiersprache und Softwareumgebung für statistische Berechnungen, Bioinformatik, Visualisierung und allgemeine Datenverarbeitung. Stellen Sie minimale, reproduzierbare, repräsentative Beispiele für Ihre Fragen bereit. Verwenden Sie dput () für Daten und geben Sie alle Nicht-Basis-Pakete mit Bibliotheksaufrufen an. Bilder für Daten oder Code nicht einbetten, eingerückte Codeblöcke verwenden. Verwenden Sie für statistische Fragen http://stats.stackexchange.com. ___ tag123caching ___ Ein Cache ist ein Mechanismus, um Daten lokal zwischenzuspeichern (Caching), um die Zugriffszeit auf weit entfernte Daten zu reduzieren. Für CPU / Disk / Web-Browsing verwenden Sie bitte relevante Tags (cpu-cache, diskcache, ...) ___ qstnhdr ___ Cache teure Operationen in R ___ answer3347430 ___

Einige einfache Möglichkeiten sind mit einigen Kombinationen von

machbar
  • %code% , um zu testen, ob eine Variable existiert, andernfalls neu laden oder neu berechnen
  • %code% , die Sie mit %code% 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.

    
___ answer3347730 ___

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.

    
___
Roberto 27.07.2010, 19:51
quelle

6 Antworten

9
%Vor%

Bearbeiten: Tippfehler behoben - Danke Dirk.

    
chrisamiller 27.07.2010, 20:08
quelle
8

Einige einfache Möglichkeiten sind mit einigen Kombinationen von

machbar
  • exists("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.

    
Dirk Eddelbuettel 27.07.2010 19:57
quelle
4

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:

%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 ?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.

    
JD Long 27.07.2010 20:36
quelle
4

(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.

    
Iterator 01.11.2011 01:35
quelle
3

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.

    
JoFrhwld 27.07.2010 19:56
quelle
3

Ohne zu sehr ins Detail zu gehen, folge ich normalerweise einem von drei Ansätzen:

  1. Verwenden Sie 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)
  2. Verwenden Sie 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>>=
  3. Verwenden Sie save und load , um die Umgebung in entscheidenden Momenten zu speichern und stellen Sie dabei sicher, dass alle Namen eindeutig sind.
Shane 27.07.2010 20:07
quelle

Tags und Links