并行的foreach循环产生mclapply错误

use*_*062 5 parallel-processing r

这些是我在R中进行并行计算的第一步.下面的代码会导致以下错误.我很无能,因为在我写的内容中没有mclapply函数,至少我没有明确说明.

错误:

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
Run Code Online (Sandbox Code Playgroud)

码:

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)
Run Code Online (Sandbox Code Playgroud)

在另一台机器上,它可以很好地工作

registerDoParallel(cl)
Run Code Online (Sandbox Code Playgroud)

代替

registerDoMC(cl)
Run Code Online (Sandbox Code Playgroud)

Ste*_*ton 9

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

如果使用doMC,则永远不会创建群集对象.最小的doMC例子如下:

library(doMC)
registerDoMC(3)
foreach(i=1:10) %dopar% sqrt(i)
Run Code Online (Sandbox Code Playgroud)

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

library(doParallel)
registerDoParallel(3)
foreach(i=1:10) %dopar% sqrt(i)
Run Code Online (Sandbox Code Playgroud)

令人困惑的是,在Windows上,doParallel实际上将在幕后创建和使用集群对象,而在Linux和Mac OS X上,它不使用集群对象,因为它mclapplydoMC包中使用.我认为这很方便,但它可能会引起混淆.