5

Those are my first steps with parallel computing in R. The code below results in the following error. I am clueless, since there is no mclapply function in what I wrote, at least I did not put it explicitly.

Error:

Error in mclapply(argsList, FUN, mc.preschedule = preschedule, mc.set.seed = set.seed,  : 
  (list) object cannot be coerced to type 'integer'
Calls: %dopar% -> <Anonymous> -> mclapply
Execution halted

Code:

dist<-array(0, dim=c(320,500,25))

mc<-8
cl<-makeCluster(mc)
registerDoMC(cl)
opts<-list(chunkSize=10)

for(a in 1:25) {
  dist[,,a]<-foreach(x=1:500, .combine='cbind', .options.mc=opts) %:% 
    foreach(y=1:320, .combine='c') %dopar% {
      gcd.slc(crdsx[y,x], crdsy[y,x], lot[a,5], lot[a,4])
    }
}
stopCluster(cl)

On a different machine, it works nicely with

registerDoParallel(cl)

instead of

registerDoMC(cl)
4

1 回答 1

10

您收到该错误是因为registerDoMC需要一个整数参数,而不是一个集群对象,而registerDoParallel需要一个整数或一个集群对象。基本上,您需要决定使用哪个包而不是混合它们。

如果你使用doMC,那么你永远不会创建一个集群对象。一个最小的doMC示例如下所示:

library(doMC)
registerDoMC(3)
foreach(i=1:10) %dopar% sqrt(i)

doParallel包是doMCdoSNOW包的混搭,因此您不需要使用集群对象。将前面的示例转换doParallel为非常简单:

library(doParallel)
registerDoParallel(3)
foreach(i=1:10) %dopar% sqrt(i)

令人困惑的是,在 Windows 上,doParallel实际上会在幕后创建和使用集群对象,而在 Linux 和 Mac OS X 上,它不使用集群对象,因为它mclapply就像在doMC包中一样使用。我认为这很方便,但它可能会造成混乱。

于 2013-06-28T14:17:11.013 回答