R: Ужасно медленная скорость чтения с использованием RODBC и SQL Server.

Я новичок в R, но мне интересно использовать Shiny для создания динамических диаграмм, используя данные, хранящиеся в базе данных SQL Server. Чтобы включить интерактивность, я хочу ввести необработанные данные из базы данных и выполнить вычисления в R вместо того, чтобы база данных суммировала данные.

Я могу подключиться к базе данных, используя RODBCвыполнить запрос и получить результаты в виде data.frame, Тем не менее, время чтения в R примерно в 12 раз длиннее, чем тот же запрос, выполняемый в SQL Server Management Studio (SSMS). SSMS занимает ~600 мс, тогда как R занимает около 7,6 секунд. У меня вопрос, делаю ли я что-то не так, или R просто очень медленно с доступом к базе данных? И если да, есть ли более быстрые альтернативы (например, запись выходных данных базы данных в файл и чтение файла)?

Немного информации о запросе, которая может помочь: Запрос извлекает около 250 тыс. Строк с 4 столбцами. Первый столбец - это дата, а остальные три - числовые значения. Машина работает R SSMS - это рабочая станция высокого класса Win 7 с 32 ГБ памяти. R команда, которую я запускаю, это:

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

который возвращает:

user  system elapsed
7.17   0.01   7.58

Интересно, что кажется, что передача данных из SQL на мою машину происходит быстро, но это R заняты внутренними делами в течение нескольких секунд, прежде чем вернуть data.frame, Я вижу это, потому что загрузка сети резко возрастает в первую секунду и почти сразу возвращается к нулю. Затем, через несколько секунд, Rdata.frame возвращается.

2 ответа

Решение

Я бы попробовал RJDBC http://cran.r-project.org/web/packages/RJDBC/RJDBC.pdf

с этими драйверами 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")

Я хотел бы убедиться, что ваш часовой пояс R - sys.setenv(TZ='GMT'), установленный, например, в GMT - совпадает с часовым поясом сервера SQL, из которого вы извлекаете данные. Возможно, для интерпретации столбца даты требуется много времени, особенно если у него есть временная метка.

RJDBC будет работать быстрее, потому что он преобразует дату в символ и все остальное в число. RODBC попытается сохранить тип данных таблицы SQL.

Другие вопросы по тегам