【发布时间】:2017-06-30 02:30:41
【问题描述】:
我正在尝试使用 foreach 从目录中读取数据文件。但这给了我一个错误。它可以在我的办公室机器上工作,但不能在家里工作。两台机器都有4核,检查底部的输出。这是代码
rm(list=ls())
setwd("D:/Test")
library(foreach)
library(doParallel)
c1<-makeCluster(4, outfile = "debug.txt")
CE<-clusterEvalQ(c1, .libPaths(""))
registerDoParallel(c1)
print(paste0("Cores = ",detectCores()))
file.names <- dir(pattern ="h00|B00")
output<-list()
output<-foreach (i=1:4) %dopar% {
read.table(file=file.names[i])
}
stopCluster(c1)
我收到错误:
{ 中的错误:任务 1 失败 - “无法打开连接”
【问题讨论】:
-
您是否尝试过用
for循环替换foreach调用?如果您怀疑集群会导致问题,那么以这种方式进行调试总是一个好主意。 -
它适用于 for 循环,但不适用于 foreach。我在调试文件中发现它在目录中找不到文件。但我检查了包含从目录加载的正确文件名的 file.names。
-
我不确定
foreach后端,但最好将绝对文件路径发送到每个节点,而不是相对路径。您可以通过在您的dir调用中包含full.names=TRUE来做到这一点...相对路径(您在此处使用)依赖于所有节点保留的工作目录,这可能不会发生(再次,我不是当然)。 -
我找到了解决方案但不明白,为什么前面的代码在我的办公室机器上工作,但在家里的机器上却不行。除了 rosscova 建议的,我还需要包含目录路径。应该是 dir("D:/Test",pattern ="h00|b00",full.names=TRUE)
标签: r foreach parallel-processing