0

我正在尝试使用 DoMC 构建一个并行的 foreach 循环,但是发生了一些奇怪的行为。代码看起来像这样

for (file in files) {
do stuff
for (extra in extras) {
do some heavy stuff
}
}
  • 当我加载 DoMC 或 DoParallel 时,循环开始使用一个核心,但在第二个循环中它使用所有 4 个核心
  • 当我将 for 循环切换到 foreach %do% 时,我得到了完全相同的行为。
  • 如果我将 foreach 用于外部循环并将内部作为 for 循环,则脚本会变慢。它从 4 个并行作业开始,然后它们都停止并逐渐减少 CPU 使用率。

我想要的是并行化顶部循环而不是内部第二个循环。有谁知道发生了什么?我过去使用过 foreach 和 doMC,以前从未遇到过这个问题。

4

1 回答 1

1

看起来你有一些事情要做,但这里还不足以确定:

如果您在 RStudio 中使用它,它可能无法正常工作,这是 doMC 的一个明确限制。尝试直接从 R 64 位运行它。

您需要require(doMC)library(doMC)调用该软件包,但您还需要在您的机器上注册它,否则它将无法正常工作

registerDoMC(4) 

那 4 告诉它要运行多少个内核。如果你什么都不说,它会尝试使用你核心的 1/2。

而你上面没有完整的代码,合适的格式是:

foreach(file in files) %dopar% { stuff to do }

您必须明确告诉它使用该%dopar%命令进行并行处理。如果您想在一个区域而不是其他区域使用所有内核,那么您需要设置选项来告诉它您的功能或代码的各个部分有多少内核。但是,如果您告诉外部循环使用 4,而内部循环使用 2,则它可能比在外部循环中将其设置为 4 并让它自己管理事情要慢。我不是 100% 清楚它是如何完成交接的,实验看看。

要更改核心数,只需添加以下行:

options(cores=2)

我希望这有帮助!

于 2016-07-12T15:49:31.093 回答