Rechengeschwindigkeit in R?


16

Ich wurde beauftragt, eines unserer aktuellen großen stochastischen Modelle aus SAS in eine neue Sprache zu überführen. Persönlich bevorzuge ich eine traditionell kompilierte Sprache, aber der PI möchte, dass ich R auschecke, das ich nie benutzt habe. Unsere Motivation, das Modell aus SAS herauszuholen, ist, dass (1) viele Menschen keinen Zugang dazu haben, weil SAS teuer ist, (2) wir versuchen, uns von einer interpretierten Sprache zu lösen, und (3) SAS ist langsam die Art von Modell, das wir haben.

Für (1) erfüllt R offensichtlich das Bedürfnis, frei zu sein. Für (2) möchten wir im Idealfall eine ausführbare Datei erstellen, aber normalerweise wird R als Skriptsprache verwendet. Ich sehe, dass kürzlich jemand einen R-Compiler herausgebracht hat - wurde dies gut aufgenommen? Ist es einfach zu bedienen Wir möchten den Benutzer nicht dazu zwingen, R selbst herunterzuladen. Für (3) ist unser Problem mit SAS die Zeit, die wir für das Schreiben und Lesen von Datensätzen aufwenden. Unser Modell ist rechenintensiv und wir sind oft durch die Laufzeit begrenzt. (ZB ist es nicht ungewöhnlich, dass jemand über das Wochenende die Computer anderer Leute entführt, um Läufe durchzuführen.) Wir haben ein ähnliches Modell in Fortran gebaut, das nicht das gleiche Problem hat, da alle Arbeiten im Speicher ausgeführt werden. Wie funktioniert R? Wird es dasselbe sein wie SAS, da es in Datenschritten arbeitet, Dateien lesen und schreiben? Oder kann es Array-Manipulation im Speicher tun?


Normalerweise können Sie sas beschleunigen, indem Sie Ihre gesamte Arbeit in einem einzigen Datenschritt erledigen. Dies sollte die I / O-Zeiten verkürzen, da Sie die Daten effektiv nur einmal einlesen. Wenn Sie viele Verfahren anwenden, werden Sie auch langsamer. Wenn Sie beispielsweise wiederholt proc glm oder proc logistic aufrufen (z. B. für einen Bootstrap), ist es schneller, einen großen Datensatz zu erstellen und eine by-Anweisung zu verwenden, als viele proc-Aufrufe aufzurufen (z. B. mit einer Makro-Schleife% do). Wenn Sie so gut programmieren, sollten Sie keine Laufzeitprobleme durch das Lesen und Ausgeben von Dateien haben (zumindest nicht mehr als bei anderer Software
Wahrscheinlichkeitslogik

Außerdem können Sie temporäre Arrays in sas-Datenschritten verwenden, ähnlich wie Sie Matrizen in R.
Wahrscheinlichkeitslogik

Antworten:


18

R arbeitet im Arbeitsspeicher - daher müssen Ihre Daten für die meisten Funktionen in den Arbeitsspeicher passen.

Das Compiler-Paket ist, wenn ich an das denke, woran Sie denken ( das mit R gelieferte Compiler- Paket von Luke Tierney ), nicht dasselbe wie eine kompilierte Sprache im herkömmlichen Sinne (C, Fortran). Es handelt sich um einen Byte-Compiler für R im Sinne von Java-Bytecode, der von der Java-VM ausgeführt wird, oder um eine Bytekompilierung von Emacs-LISP-Code. Es kompiliert R-Code nicht in Maschinencode, sondern bereitet den R-Code in Bytecode vor, damit er effizienter verwendet werden kann als zu interpretierender roher R-Code.

Beachten Sie, dass Sie, wenn Sie Fortran gut geformt haben, wahrscheinlich das Beste aus beiden Welten haben könnten. R kann kompilierte Fortran-Routinen aufrufen.


Vielen Dank! Es ist schön zu wissen, dass ich die großartigen R-Grafiken haben und kompilierte Fortran-Routinen aufrufen kann. Das könnte die Antwort sein!
Melissa

2
Nur um Gavins Anmerkung zum Arbeitsspeicher zu erweitern: Lesen
Brandon Bertelsen

1
Denken Sie auch daran, dass Rcpp wahrscheinlich verwendet werden kann, um inkrementelle Leistungssteigerungen zu erzielen.
Brandon Bertelsen

Rcpp ist nützlich, um C ++ für die Verwendung in / mit R zu verpacken. Es unterstützt den Prozess (immens), verwendet jedoch weiterhin die grundlegenden Tools von R, um kompilierten Code aufzurufen. Wenn der OP bereits über Fortran-Codes oder Fortran-Fähigkeiten verfügt, ist Rcpp möglicherweise von geringerem Nutzen.
Setzen Sie Monica - G. Simpson am

13

Ich habe es SAS15 Jahre lang benutzt und habe in Rden letzten 6 Monaten angefangen, es ernsthaft zu benutzen, wobei ich ein paar Jahre vorher daran herumgebastelt habe. In Bezug auf die Programmierung werden R Daten direkt bearbeitet, es gibt keine Entsprechung zu DATAoder PROC SQLProzeduren, da diese nicht benötigt werden (letztere sind effizienter, SASwenn viele Daten aus externen Datenquellen, z. B. Verwaltungsdaten, bearbeitet werden müssen). Das bedeutet, dass die Datenmanipulation jetzt schneller Rund mit weniger Code durchgeführt werden kann.

Das Hauptproblem, auf das ich gestoßen bin, ist das Gedächtnis. Nicht bei allen R-Paketen sind WEIGHTTypspezifikationen zulässig. Wenn Sie also SASDatasets mit Variablen haben, die in FREQoder REPLICATEAnweisungen verwendet werden, können Probleme auftreten. Ich habe mir die ffund bigmemory-Pakete in R angesehen, aber sie scheinen nicht mit allen R-Paketen kompatibel zu sein. Wenn Sie also sehr große Datensätze haben, für die Analysen erforderlich sind, die relativ ungewöhnlich und aggregiert sind, können Probleme mit dem Arbeitsspeicher auftreten.

Wenn Sie dies für die Automatisierung SAS macrostun, sollten Sie in der Lage sein, das Äquivalent zu programmieren Rund als Batch auszuführen.

Zum Programmieren habe Rich Notepad++die Sprache verwendet und eingestellt Rund entdecke jetzt die Freuden von R Studio. Beide Produkte sind kostenlos und haben eine Sprachmarkierung wie die verbesserte SASSyntax-GUI (in der ich bisher nur den Syntax-Bildschirm verwendet habe SAS).

Es gibt eine Website und ein dazugehöriges Buch für Leute, die von SASnach tauschen R. Ich fand sie nützlich, um herauszufinden, wie man einige SASBefehle übersetzt R.

Update: eine Sache , die mich treibt Nüsse , wenn sie kommt , Rist , dass Rnicht davon ausgehen , alles , was ein Datensatz ist ( data framein Rparlance), weil es in der Art und Weise nicht ein statistisches Paket ist , dass SAS, SPSS, Stata, etc. ist. Ich habe zum Beispiel eine Weile gebraucht , um ifAnweisungen zum Laufen zu bringen , weil ich immer wieder die Hilfe für ifAnweisungen mit Vektoren (oder vielleicht Matrizen) erhielt, während ich eine ifAnweisung brauchte , mit der es funktionierte data frames. Daher müssen die Hilfeseiten wahrscheinlich genauer gelesen werden, als Sie es normalerweise tun würden, da Sie überprüfen müssen, ob der gewünschte Befehl mit dem von Ihnen verwendeten Datenobjekttyp funktioniert.

Das, was mich beim Erlernen eines neuen RBefehls (z. B. einer Analysemethode in einem beigestellten Paket) immer noch verrückt macht, ist, dass die Hilfe für Befehle oft nicht vollständig in sich geschlossen ist. Ich gehe zur Hilfeseite, um zu versuchen, den Befehl und die darin oft ...enthaltenen Verwendungshinweise zu lernen . Manchmal hat der Versuch herauszufinden, was dahin gehen kann oder soll, wo ...es ist, mich in eine rekursive Schleife geführt. Die relative Kürze der Hilfetexte, aus SASdenen ausführliche Syntaxbeispiele und Arbeitsbeispiele mit einer Erläuterung der Studie im Beispiel hervorgehen, war ein ziemlicher Schock.


2
+1 Bitte aktualisieren Sie unseren Meta-Thread, in dem Links zu statistischen Softwareressourcen gesammelt wurden. Es gibt eine Antwort für R und eine für SAS: Beide würden von einem Link zu r4stats.com profitieren. (Dieser Thread ist tatsächlich ein Teil unserer FAQ. Wir hoffen, ihn aktuell und nützlich zu halten.)
whuber

1
R hat auch Pakete, die den SQL-Zugriff über RODBC-Treiber oder SQLite unterstützen.
DWin

1
Ich stimme Ihren Kommentaren zu R help zu. Ich habe im Wesentlichen darauf hingewiesen, was Sie vor vielen Jahren auf einer der R-Mailinglisten gesagt haben. Die Resonanz war nicht positiv. Fairerweise habe ich (a) mich wahrscheinlich nicht sehr gut ausgedrückt und keine konkreten Beispiele genannt und (b) die Angelegenheit nicht weiterverfolgt. Zusammenfassend ist Problem 1 ein zu kompliziertes Beispiel mit zu vielen nicht verwandten Konzepten. Komplizierte Beispiele sind in Ordnung, sollten jedoch einfachen Beispielen folgen. Problem 2 ist, dass es fast keine Anmerkungen oder Erklärungen zu den Beispielen gibt.
Faheem Mitha

In Bezug auf das R erinnert "Hilfe" an etwas, was mein Chef zu mir gesagt hat. "Du lernst R, indem du es mit jemandem machst, der bereits weiß, dass R neben dir am Computer sitzt"
Wahrscheinlichkeitslogik

Und für alle anderen gibt es Bücher und Stack Overflow. Ja, es ist ziemlich schwer, R selbst zu lernen, zumindest war es für mich so.
Michelle

10

R ist eine Programmiersprache. Es funktioniert nicht in Datenschritten. Es macht, was immer Sie wollen, denn es ist nur eine Programmiersprache, ein Sklave für Ihre Wünsche, ausgedrückt in geschweiften Klammern und Doppelpunkten.

Stellen Sie es sich wie Fortran oder C vor, aber mit impliziter Vektorisierung, damit Sie keine Schleife über Arrays durchführen müssen, und dynamischer Speicherverwaltung, damit Sie zu keinem Zeitpunkt malloc () oder Arraygrößen deklarieren müssen.

Meistens erledigt es seine ganze Arbeit im Speicher, aber wenn Sie einen Teil einer Datei einlesen, mungieren, dann einige der Ergebnisse ausspucken und das nächste Bit einlesen wollen, dann schreiben Sie ein R-Programm, das tut das.

Sie widersprechen sich darin, dass das Modell rechenintensiv ist, SAS jedoch aufgrund von E / A langsam ist ... Der eine oder andere sicherlich ...

Wenn Sie in Fortran bereits etwas Ähnliches haben und sagen, Sie möchten sich von einer interpretierten Sprache lösen, warum dann nicht auch in Fortran?

Der R-Compiler kann einige Beschleunigungen verursachen, aber wenn Ihr R-Code trotzdem gut geschrieben ist, werden Sie nichts zu massives bekommen - anders als wenn Sie ihn in C oder Fortran schreiben.


Ah, ich habe mich nicht gut erklärt. Die Manipulation von Datensätzen ist intensiv, was in SAS zu viel Zeit für E / A bedeutet. Mein erster Vorschlag war Fortran, aber der PI ist daran interessiert, dass wir zu R wechseln, also wollte er, dass ich es überprüfe. Vielen Dank!
Melissa

7

Ich verstehe, dass SAS standardmäßig mit Modellen arbeiten kann, die größer als der Arbeitsspeicher sind, aber dies ist bei R nicht der Fall, es sei denn, Sie verwenden speziell Pakete wie biglm oder ff.

Wenn Sie jedoch Array-Arbeiten in R ausführen, die vektorisiert werden können, ist dies sehr schnell - in einigen Fällen vielleicht halb so schnell wie ein C-Programm schleppend. Um Ihnen ein Beispiel zu geben:

# create a data.frame with 4 columns of standard normally distributed RVs
N <- 10000

# test 1
system.time( {df1 <- data.frame(h1=rnorm(N),
                h2=rpois(N, lambda=5),
                h3=runif(N),
                h4=rexp(N))
} )
# about 0.003 seconds elapsed time

# vectorised sum of columns 1 to 4
# i.e. it can work on an entire column all at once
# test 2
system.time( { df1$rowtotal1 <- df1$h1 + df1$h2 + df1$h3 + df1$h4 })
# about 0.001 seconds elapsed time

# test 3
# another version of the vectorised sum
system.time( { df1$rowtotal2 <- rowSums(df1[,c(1:4)]) })
# about 0.001 seconds elapsed time

# test 4
# using a loop... THIS IS *VERY* SLOW AND GENERALLY A BAD IDEA!!! :-)
system.time( {
        for(i in 1:nrow(df1)) {
                df1$rowtotal3 <- df1[i,1]+ df1[i,2] + df1[i,3] + df1[i,4]
        }
} )
# about 9.2 seconds elapsed time

Als ich N um den Faktor 10 auf 100.000 erhöhte, gab ich Test 4 nach 20 Minuten auf, aber die Tests 1: 3 erforderten 61, 3 und 37 Milli -Sekunden jeder

Für N = 10.000.000 beträgt die Zeit für die Tests 1: 3 3,3 s, 0,6 s und 1,6 s

Beachten Sie, dass dies auf einem i7-Laptop durchgeführt wurde und bei 480 MB für N = 10 Millionen kein Problem mit dem Speicher bestand.

Für Benutzer von 32-Bit-Fenstern gibt es ein Speicherlimit von 1,5 GB für R, unabhängig davon, wie viel Speicher Sie haben. Für 64-Bit-Fenster oder 64-Bit-Linux gibt es jedoch kein solches Limit. Heutzutage ist der Speicher sehr billig im Vergleich zu den Kosten einer Stunde meiner Zeit, daher kaufe ich mir einfach mehr Speicher, anstatt Zeit damit zu verbringen, dies zu umgehen. Dies setzt jedoch voraus, dass Ihr Modell in den Speicher passt.


1
(+1) Vielen Dank für das Anbieten der nützlichen Illustrationen, Sean!
whuber

3

(2) Im Idealfall möchten wir eine ausführbare Datei erstellen, aber normalerweise wird R als Skriptsprache verwendet

Ja, und das ist der gute Grund, warum Sie zu R wechseln. Das Interesse am Schreiben eines R-Pakets besteht darin, Benutzern die Möglichkeit zu geben, Ihre Funktionen einfach mit anderen von R bereitgestellten Tools zu interagieren, z. Wenn Sie dies nicht für wichtig halten, bleiben Sie bei C / C ++ oder Ihrer bevorzugten kompilierten Sprache.

Ich möchte eine Einschränkung hinzufügen: Sie sind bereits Programmierer, und das Erlernen von R ist einfach und schnell. Lernen effizienter R-Programmierung wird länger sein. Da R interpretiert wird, verbergen sich die Konstanten in derÖ()von der asymptotischen Komplexität kann riesig oder klein sein ... Wenn Sie zum Beispiel an Läufen in Ihren Daten interessiert sind, werden Sie verwenden rle(), es wird schnell sein (es ist eine vorkompilierte Funktion). Wenn Sie genau den gleichen Algorithmus schreiben, ist er langsam (er wird interpretiert). Dies ist ein einfaches Beispiel: Sie haben viele Tricks mit Vektoren und Matrizen, um interpretierte Schleifen zu vermeiden und vorkompilierte Funktionen den ganzen Job erledigen zu lassen.

Sei also sehr vorsichtig. Nach Ihren ersten Versuchen werden Sie sicherlich ein Ekel mit R haben, weil Sie es langsam finden, mit einer seltsamen Syntax usw. Wenn Sie es einmal wissen, kann es ein sehr effizientes Werkzeug sein. Sie können sogar mit der Skripterstellung Ihrer Methoden in R als Vorbereitungsphase für die C / C ++ - Codierung enden. Die ultimative Phase besteht darin, die API von R zu lernen, um vorkompilierte Funktionen zu erstellen, und Sie werden ein R-Assistent sein :)


2

Die Manipulation von Arrays im Speicher ist anscheinend eine große Sache für SAS. Ich kenne die Besonderheiten von R nicht, aber ich vermute, dass R standardmäßig im Speicher arbeitet, da die Speichererweiterungspakete für R, ff und bigmemory Daten vom Speicher auf die Festplatte verschieben. Ich habe Hinweise für Sie, wenn Sie entweder die Geschwindigkeit oder die Speichernutzung verbessern möchten. Um die Geschwindigkeit zu verbessern, müssen Sie zuerst R wie vorgesehen verwenden, dh Ihren Code vektorisieren und die Bytecode-Kompilierung verwenden. (Außerdem: Vermeiden Sie Speicherkopiervorgänge so weit wie möglich.) Verwenden Sie zweitens den mitgelieferten Code-Profiler Rprof (), um langsame Patches in Ihrem Code zu identifizieren, und schreiben Sie sie gegebenenfalls in C oder C ++ um. Wenn Sie mehr Speicher benötigen, können Sie das Argument skip in der Funktion read.table () verwenden, um jeweils einen Block Ihrer Daten einzulesen, und Sie können auch ein Paket wie RMySQL verwenden, das R Dienstprogramme zur Datenbankmanipulation hinzufügt. Wenn Sie noch mehr Speicherplatz benötigen und sich die damit einhergehende Geschwindigkeitsreduzierung leisten können, können Sie mit dem Schneepaket R parallel laufen lassen. (Details dazu und vieles mehr finden Sie in dem Ende letzten Jahres erschienenen Buch "The Art of R Programming" von Norman Matloff. Details zu den hier genannten Paketen finden Sie online.)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.