【问题标题】:%dopar% parallel foreach loop fails to exit when called from inside a function (R)从函数内部调用时,%dopar% 并行 foreach 循环无法退出 (R)
【发布时间】: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


【解决方案1】:

问题是您有多个进程打开和关闭同一个文件。通常当一个文件被一个进程打开时,它会被其他进程锁定,从而阻止并行读取文件

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 2016-03-11
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2018-07-15
    • 2021-09-05
    相关资源
    最近更新 更多