我有六个SQL查询,我脚本虽然R,每个花费很长时间(每个约30分钟).一旦每个查询返回我,然后操作一些标准报告的数据.
我想做的是使用我的多核机器从R并行运行这些sql请求
我在一台带有Oracle DB的Windows机器上.我正在跟着一个blog post使用doSNOW和foreach来尝试分割这些请求,这是我在stackoverflow上找到的最好的东西.
我已经能够使进程适用于非并行的%do%版本的foreach,但不是%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,databases[i])) outputPar[i] = result } ) outputPar sqlQuery(ch,qryA4) sqlQuery(ch,qryB4)
解决方法
当您将分配outputPar [i] =结果放在串行foreach循环中时,这是可以的(但不是真正使用foreach).当您在并行循环中进行此分配时,它不行.见大卫·史密斯在革命中回答的类似问题,见
http://tolstoy.newcastle.edu.au/R/e10/help/10/04/3237.html.
作为解决方案,
system.time( outputPar <- foreach(i = 1:2,.packages="RODBC")%dopar%{ #Connecting to database through RODBC ch=odbcConnect(dsn,believeNRows=FALSE) #Test connection odbcGetInfo(ch) result<-sqlQuery(ch,databases[i])) result } )