it-swarm.com.de

R: Langsam langsame Leseleistung mit ODBC und SQL Server

Ich bin neu bei R, möchte aber Shiny verwenden, um dynamische Diagramme mit Daten zu erstellen, die in einer SQL Server-Datenbank gespeichert sind. Um Interaktivität zu ermöglichen, möchte ich die Rohdaten aus der Datenbank importieren und Berechnungen in R durchführen, anstatt die Daten in der Datenbank zusammenfassen zu lassen.

Ich kann über RODBC eine Verbindung zur Datenbank herstellen, eine Abfrage ausführen und Ergebnisse in einem data.frame erhalten. Die Lesezeit in R ist jedoch etwa 12x länger als die gleiche Abfrage, die in SQL Server Management Studio (SSMS) ausgeführt wird. SSMS dauert ~ 600 ms, während R ungefähr 7,6 Sekunden benötigt. Meine Frage ist, ob ich etwas falsch mache oder ist R beim Datenbankzugriff wirklich sehr langsam? Wenn ja, gibt es schnellere Alternativen (z. B. Schreiben der Datenbankausgabe in eine Datei und Lesen der Datei)?

Einige Informationen zur Abfrage, die möglicherweise hilfreich sind: Die Abfrage ruft ungefähr 250.000 Zeilen mit 4 Spalten ab. Die erste Spalte ist ein Datum und die anderen drei sind numerische Werte. Die Maschine, auf der R und SSMS ausgeführt wird, ist eine High-End-Win 7-Workstation mit 32 GB Arbeitsspeicher. Der Befehl R, den ich ausführen möchte, lautet:

system.time(df <- sqlQuery(cn, query))

was gibt zurück:

user  system elapsed
7.17   0.01   7.58

Interessanterweise scheint der Datentransfer von SQL zu meinem Computer schnell zu sein, aber R ist einige Sekunden lang intern beschäftigt, bevor er den data.frame zurückgibt. Ich sehe das, weil die Netzwerkauslastung in der ersten Sekunde ansteigt und fast sofort auf nahe 0 zurückkehrt. Dann kehrt der Rdata.frame einige Sekunden später zurück.

14
Jayhawk

Ich würde versuchen, RJDBC http://cran.r-project.org/web/packages/RJDBC/RJDBC.pdf

mit diesen Treibern https://msdn.Microsoft.com/en-us/sqlserver/aa937724.aspx

library(RJDBC)
drv <- JDBC("com.Microsoft.sqlserver.jdbc.SQLServerDriver","/sqljdbc4.jar") 
con <- dbConnect(drv, "jdbc:sqlserver://server.location", "username", "password")
dbGetQuery(con, "select column_name from table")
13
Ken Yeoh

Ich würde sicherstellen, dass Ihre R-Zeitzone - sys.setenv (TZ = 'GMT') beispielsweise auf GMT eingestellt ist, mit der Zeitzone des SQL-Servers übereinstimmt, aus der Sie Daten abrufen. Es kann sein, dass die Datumsspalte viel Zeit benötigt, um interpretiert zu werden, insbesondere wenn sie einen Zeitstempel hat.

RJDBC wird schneller ausgeführt, da es Datum in Zeichen und alles andere in Zahlen konvertiert. RODBC versucht, den Datentyp der SQL-Tabelle beizubehalten.

0
charliealpha