我想使用foreach语法查询本地存储的数据库。
我的代码是这样的:
h <- odbcDriverConnect(connection)
cl<-makeCluster(no_cores)
registerDoParallel(cl)
foreach(i = 1:dim(Table)[1],
.combine = rbind,
.export = "h",
.packages = "RODBC") %dopar% {
cat(i,"\n")
#h <- odbcDriverConnect(connection)
sqlQuery(query)
}
odbcCloseAll()
stopCluster(cl)当我使用%do%而不是%dopar%时,它正常工作,但是当我试图使它成为一个并行时,我会得到以下错误:
错误在{:任务1失败-“第一个参数不是一个开放的RODBC通道”另外:警告消息:在e$乐趣(obj,替代(Ex),parent.frame(),e$data):已经导出变量(S):h
当我将h放在foreach循环中时,它可以工作,但是我理解在每一个步骤上创建连接,我想避免这种情况。是否有任何方法可以将该连接导出到foreach (与使用其他变量进行连接的方式相同)?
发布于 2017-02-01 14:13:48
您无法将数据库连接导出到工作人员,因为它们不能正确地序列化和反序列化(因为它们包含诸如套接字连接之类的内容)。相反,您需要在工作人员上创建它们,但是为了提高效率,您应该创建它们一次,然后从您的foreach循环中反复使用它们。
由于您使用的是doParallel,所以可以使用clusterEvalQ初始化工作人员
clusterEvalQ(cl, {
library(RODBC)
connection <- "???" # how are you setting this?
h <- odbcDriverConnect(connection)
})然后,您可以从您的foreach循环中使用h,只要您阻止foreach自动将h导出到工作人员:
foreach(i = 1:dim(Table)[1],
.combine = rbind,
.noexport = "h", # make sure h is *not* exported!
.packages = "RODBC") %dopar% {
cat(i, "\n")
sqlQuery(h, query)
}使用.noexport="h"很重要,否则好的h将被屏蔽,您将从RODBC中得到一个错误。
https://stackoverflow.com/questions/41960725
复制相似问题