从函数内部调用时,%dopar%并行foreach循环无法退出{R}

时间:2016-03-08 21:21:39

标签: r foreach parallel-processing

我编写了以下代码(在RStudio for Windows中运行),使用并行的foreach循环将一长串非常大的文本文件读入内存:

open.raw.txt <- function() {
  files <- choose.files(caption="Select .txt files for import")
  cores <- detectCores() - 2
  registerDoParallel(cores)
  data <- foreach(file.temp = files[1:length(files)], .combine = cbind) %dopar% 
    as.numeric(read.table(file.temp)[, 4])
  stopImplicitCluster()
return(data)
}
然而,不幸的是,该函数无法完成,调试显示它在foreach循环阶段陷入困境。奇怪的是,Windows任务管理器表示我接近满容量处理器(我有32个内核,这应该使用其中的30个)大约10秒,然后它回落到基线。然而,循环永远不会完成,表明它正在完成工作,然后卡住了。

更奇怪的是,如果我删除'function'位并按照以下步骤逐一运行每个步骤:

files <- choose.files(caption="Select .txt files for import")
cores <- detectCores() - 2
registerDoParallel(cores)
data <- foreach(file.temp = files[1:length(files)], .combine = cbind) %dopar% 
  as.numeric(read.table(file.temp)[, 4])
stopImplicitCluster()

然后一切正常。发生了什么事?

更新:我运行了该功能,然后离开了一段时间(大约一小时),最后完成了。我不太清楚如何解释这个,因为多个核仍然只在前10秒左右使用。问题可能在于如何分享任务?或者也许内存管理?我不熟悉并行性,所以不确定如何调查它。

1 个答案:

答案 0 :(得分:0)

问题是您有多个进程打开和关闭同一个文件。通常当进程打开文件时,它会被锁定到其他进程,因此无法并行读取文件