2015-06-19 22 views
13

kullanarak yavaş yavaş okuma performansı R için yeniyim ama bir SQL Server veritabanında saklanan verileri kullanarak dinamik grafikler oluşturmak için Shiny kullanmakla ilgileniyorum. Etkileşimi etkinleştirmek için veritabanından ham verileri getirmek ve veriyi özetlemek yerine R içerisinde hesaplamalar yapmak istiyorum.R: RODBC & SQL Server

RODBC kullanarak veritabanına bağlanabiliyorum, bir sorgu yürütebilir ve sonuçları bir data.frame içinde alabilirsiniz. Ancak, R'daki okuma zamanı, SQL Server Management Studio'da (SSMS) yürütülen aynı sorgudan yaklaşık 12x daha uzundur. SSMS, ~ 600 ms alır, oysa R, yaklaşık 7.6 saniye sürer. Sorum şu: Yanlış bir şey yapıyorum veya R veritabanı erişimi ile gerçekten yavaş mı? Ve eğer öyleyse, daha hızlı alternatifler var mı (ör. Veritabanı çıktısını bir dosyaya yazmak ve dosyayı okumak)?

Yardım isteyen sorgu hakkında bazı bilgiler: Sorgu, 4 sütunlu yaklaşık 250 K satırı alır. İlk sütun bir tarih ve diğer üç sayısal değerdir. R ve SSMS'yi çalıştıran makine, 32 GB belleğe sahip son teknoloji Win 7 iş istasyonudur. Ben koşuyorum R komut şöyledir: döndüren

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

: İlginç

user system elapsed 
7.17 0.01 7.58 

, benim makineye SQL veri aktarımı hızlı görünür, ama bu R içten işlerle meşgul olduğu data.frame'u geri göndermeden önce birkaç saniye için. Bunu görüyorum çünkü ağ kullanımı ilk saniyede yükseliyor ve hemen hemen 0'a dönüyor. Sonra birkaç saniye sonra, Rdata.frame geri dönüyor.

+0

Oldukça bu kadar yavaş, bir süre sonra değerlendirdik ve RODBC kullanarak başka bir rotaya gitmeye karar verdik, bu çok basit sorgular dışında yavaşlamanın bir yoludur. – Hansi

cevap

11

denemek istiyorum emin kılacak bu sürücülerin 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") 
+2

Teşekkürler! Bu kesinlikle sorunu çözdü. Sonuçta, sonuç olarak 0.84 saniyeye düştü. – Jayhawk

0

ile RJDBC http://cran.r-project.org/web/packages/RJDBC/RJDBC.pdf

senin Ar saat dilimi - sys.setenv (TZ = 'GMT') örneğin GMT olarak ayarlanmış - veriyi çekeceğiniz yerden SQL sunucusunun saat dilimi ile aynıdır. Tarih sütununun, özellikle bir zaman damgası varsa, yorumlanması uzun sürüyor olabilir.

RJDBC, daha hızlı çalışmaya başlayacaktır çünkü bu, tarihi ve karakterleri sayısal olarak dönüştürür. RODBC, SQL tablosunun veri türünü korumaya çalışacaktır.