在 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 中使用了 fread
和 foreach
和 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)
【问题讨论】:
注意没有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:在 foreach %dopar% 中显示错误和警告消息