在 R 中将 fread 与 foreach 和 doParallel 一起使用
Using fread with foreach and doParallel in R
我在 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)
感谢user20650
在here中的参考。基本上可以通过在foreach
函数中设置.export='fread'
来解决。
更准确地说,以下内容将解决问题。
tmp<-foreach(i=1:10,.export = 'fread') %dopar% {
t <- fread('test.csv',data.table=T)
}
对于我关于嵌套 foreach
的后续问题,user20650
在他的评论中回答了这个问题。即,添加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)
}
我在 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)
感谢user20650
在here中的参考。基本上可以通过在foreach
函数中设置.export='fread'
来解决。
更准确地说,以下内容将解决问题。
tmp<-foreach(i=1:10,.export = 'fread') %dopar% {
t <- fread('test.csv',data.table=T)
}
对于我关于嵌套 foreach
的后续问题,user20650
在他的评论中回答了这个问题。即,添加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)
}