我编写了以下代码(在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秒左右使用。问题可能在于如何分享任务?或者也许内存管理?我不熟悉并行性,所以不确定如何调查它。
答案 0 :(得分:0)
问题是您有多个进程打开和关闭同一个文件。通常当进程打开文件时,它会被锁定到其他进程,因此无法并行读取文件