Распараллеливание SQL-запросов в R

У меня есть шесть SQL-запросов, которые я пишу через R, каждый из которых занимает очень много времени (~ 30 минут каждый). Как только каждый запрос возвращается, я затем манипулирую данными для некоторых стандартных отчетов.

Что я хотел бы сделать, так это использовать мою многоядерную машину для параллельного выполнения этих SQL-запросов из R.

Я работаю на машине Windows с Oracle DB.Я следил за сообщением в блоге, чтобы использовать doSNOW и foreach, чтобы попытаться разделить эти запросы, и это лучшее, что я могу найти на stackoverflow.

Мне удалось заставить процесс работать с непараллельной версией foreach %do%, но не с %dopar%. С %dopar% он просто возвращает пустой набор. Ниже приведен код, который настраивает таблицы и выполняет запросы, чтобы вы могли видеть, что происходит. Заранее извиняюсь, если слишком много базового кода.

Я просмотрел некоторые другие пакеты R, но не нашел очевидного решения. Кроме того, если у вас есть лучший способ управления такого рода процессами, мне было бы интересно его услышать - просто имейте в виду, что я аналитик, а не специалист по информатике. Спасибо!

#Creating a cluster
library(doSNOW)
cl <- makeCluster(c("localhost","localhost"), type = "SOCK")
registerDoSNOW(cl)

#Connecting to database through RODBC
ch=odbcConnect("",pwd = "xxxxx", believeNRows=FALSE)
#Test connection
odbcGetInfo(ch)

#Creating database tables for example purposes
qryA1 <- "create table temptable(test int)" 
qryA2 <- "insert into temptable(test) values((1))" 
qryA3 <- "select * from temptable" 
qryA4 <- "drop table temptable" 
qryB1 <- "create table temptable2(test int)" 
qryB2 <- "insert into temptable2(test) values((2))" 
qryB3 <- "select * from temptable2" 
qryB4 <- "drop table temptable2"  

sqlQuery(ch, qryA1) 
sqlQuery(ch, qryA2) 
doesItWork <- sqlQuery(ch, qryA3) 
doesItWork
sqlQuery(ch, qryB1) 
sqlQuery(ch, qryB2) 
doesItWork <- sqlQuery(ch, qryB3) 
doesItWork

result = c()
output = c()
databases <- list('temptable','temptable2')


#Non-parallel version of foreach
system.time(
foreach(i = 1:2)%do%{
result<-sqlQuery(ch,paste('SELECT * FROM ',databases[i]))   
output[i] = result
}
) 

output

#Parallel version of foreach

outputPar = c()

system.time(
foreach(i = 1:2)%dopar%{
#Connecting to database through RODBC
ch=odbcConnect(dsn ,pwd = "xxxxxx", believeNRows=FALSE)
#Test connection
odbcGetInfo(ch)
result<-sqlQuery(ch,paste('SELECT * FROM ',databases[i]))   
outputPar[i] = result
}
) 

outputPar

sqlQuery(ch, qryA4)
sqlQuery(ch, qryB4) 

16
задан Community 23 May 2017 в 11:59
поделиться