在 R 中将 fread 与 foreach 和 doParallel 一起使用

Posted

技术标签:

【中文标题】在 R 中将 fread 与 foreach 和 doParallel 一起使用【英文标题】:Using fread with foreach and doParallel in R 【发布时间】:2015-08-31 16:01:48 【问题描述】:

我在 ubuntu 14.04 的 R 3.2.0 中使用了 freadforeachdoParallel 包。即使我没有使用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)

   

【问题讨论】:

注意没有registerDoParallel 它不会并行运行(你只会在第一次得到警告)。要让fread 工作,您可能需要通过clusterEvalQ(cl, library(data.table))(未经测试)将函数传递给每个集群 可能对***.com/questions/17345271/…和***.com/questions/27341210/…感兴趣 是的,你是对的。感谢您指出。我也是第一次收到这个警告。看起来我对 ubuntu 和 windows 都有同样的问题。 在 ubuntu 中使用 registerDoParallel(cl) 我得到了相同的错误消息 Error in : task 1 failed - "could not find function "fread"" @user20650,感谢您的提示。 foreach(i=1:10,.export='fread')可以解决问题。 【参考方案1】:

感谢user20650 在here 中的引用。基本上可以通过在foreach函数中设置.export='fread'来解决。

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

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

对于我关于嵌套foreach 的后续问题,user20650 在他的 cmets 中回答了这个问题。即添加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)
     

【讨论】:

请参阅***.com/questions/30927693/… 关于双 for 循环

以上是关于在 R 中将 fread 与 foreach 和 doParallel 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 xts 中将 period.apply 与 doParallel 和 foreach 一起使用?

在R中将大文件分成小文件

R:在 foreach %dopar% 中显示错误和警告消息

如何在 Qt 中将 foreach 与 QDomNodeList 一起使用?

C 编程中的 fread 函数

在 .NET 3.5 中将 Parallel.Foreach 与分区器一起使用