我有六个SQL查询,通过R脚本执行,每个查询需要很长时间(约30分钟)。每个查询返回后,我会操作数据生成一些标准报告。
我想做的是利用我多核机器从R并行运行这些SQL请求。
我使用Oracle DB的Windows机器。我正在stackoverflow上按照 blog post 的方法尝试使用doSNOW和foreach拆分这些请求,这是我能找到的最好的东西。
我已经成功地为非并行的%do% foreach版本获得了过程,但对于%dopar%,它只返回一个空集。下面是设置表格和运行查询的代码,这样您就可以看到发生了什么。如果有太多基本代码,请提前道歉。
我想做的是利用我多核机器从R并行运行这些SQL请求。
我使用Oracle DB的Windows机器。我正在stackoverflow上按照 blog post 的方法尝试使用doSNOW和foreach拆分这些请求,这是我能找到的最好的东西。
我已经成功地为非并行的%do% foreach版本获得了过程,但对于%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)
RODBC
包?如果没有,请在您的foreach()
调用中添加.packages="RODBC"
。 - BenBarnesforeach
中添加.packages="RODBC"
,但不幸的是我仍然收到了一个空集合。 - Andrew Elliott