【发布时间】:2016-03-08 21:21:39
【问题描述】:
我编写了以下代码(在 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 秒,然后它又回到基线。但是循环永远不会完成,表明它正在执行工作,然后卡住了。
更奇怪的是,如果我删除“功能”位并按如下方式逐个运行每个步骤:
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 秒左右使用。问题可能与任务的共享方式有关吗?或者也许是内存管理?我是并行的新手,所以不知道如何调查。
【问题讨论】:
-
你是怎么调用函数的?
-
数据
-
您能否从函数中删除对
stopImplicitCluster的调用,以查看它是否挂起? -
谢谢史蒂夫。我试过了,还在两者之间增加了一秒钟的睡眠时间(以防它被自己带走)但没有运气。我还认为问题可能在于写入“数据”可能是因为权限。我不太了解权限在 Windows 上的工作原理,但我尝试以管理员身份运行 R/RStudio,但并没有什么不同。
-
刚刚发布了更新。
标签: r foreach parallel-processing