首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RODBC & foreach

RODBC & foreach
EN

Stack Overflow用户
提问于 2017-01-31 14:59:15
回答 1查看 1K关注 0票数 0

我想使用foreach语法查询本地存储的数据库。

我的代码是这样的:

代码语言:javascript
复制
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 (与使用其他变量进行连接的方式相同)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-01 14:13:48

您无法将数据库连接导出到工作人员,因为它们不能正确地序列化和反序列化(因为它们包含诸如套接字连接之类的内容)。相反,您需要在工作人员上创建它们,但是为了提高效率,您应该创建它们一次,然后从您的foreach循环中反复使用它们。

由于您使用的是doParallel,所以可以使用clusterEvalQ初始化工作人员

代码语言:javascript
复制
clusterEvalQ(cl, {
  library(RODBC)
  connection <- "???"  # how are you setting this?
  h <- odbcDriverConnect(connection)
})

然后,您可以从您的foreach循环中使用h,只要您阻止foreach自动将h导出到工作人员:

代码语言:javascript
复制
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中得到一个错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41960725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档