5

我在 ubuntu 14.04 的 R 3.2.0 中使用freadforeach打包doParallel。以下代码工作得很好,即使我没有使用registerDoParallel.

library(foreach)
library(doParallel)
library(data.table)

write.csv(iris,'test.csv',row.names=F)

cl<-makeCluster(4)

tmp<-foreach(i=1:10) %dopar% { t <- fread('test.csv') }

tmp<-rbindlist(tmp)

stopCluster(cl)

但是,当切换到 Windows 7 时,无论有没有“registerDoParallel”,它都不再工作。

library(foreach)
library(doParallel)
#library(doSNOW)
library(data.table)

write.csv(iris,'test.csv',row.names=F)

cl<-makeCluster(4) 
registerDoParallel(cl)
#registerDoSNOW(cl)

tmp<-foreach(i=1:10) %dopar% { t <- fread('test.csv') }

tmp<-rbindlist(tmp)

stopCluster(cl)

'doSNOW' 包也不起作用。下面是错误信息。

Error in { : task 1 failed - "could not find function "fread""

有没有人有类似的经历?


一个后续问题是关于嵌套的foreach。似乎以下行不通。

cl<-makeCluster(4)
registerDoParallel(cl)
clusterEvalQ(cl , library(data.table))

tmp<-foreach(j=1:10) %dopar% {

            tmp1<-foreach(i=1:10) %dopar% {
                          t<-fread('test.csv',data.table=T)
                   }  
            rbindlist(tmp1)
      }
stopCluster(cl)

   

4

1 回答 1

3

感谢这里user20650的参考。基本上可以通过在函数中设置来解决。.export='fread'foreach

更准确地说,以下将解决该问题。

 tmp<-foreach(i=1:10,.export = 'fread') %dopar% { 
              t <- fread('test.csv',data.table=T) 
      }

对于我关于嵌套的后续问题foreachuser20650在他的评论中回答了它。即,添加clusterEvalQ(cl , c(library(data.table),library(foreach))). 以下代码似乎适用于 ubuntu 和 windows。

cl<-makeCluster(4)
registerDoParallel(cl)
clusterEvalQ(cl , c(library(data.table),library(foreach)))

tmp<-foreach(j=1:10) %dopar% {

     tmp1<-foreach(i=1:10) %dopar% { t <- fread('test.csv',data.table=T) }
     rbindlist(tmp1)
     }
于 2015-06-16T01:57:32.273 回答