Future将并行运行部分代码

sim*_*321 5 parallel-processing r

我有疑问future(),doFuture()用法.

我想N并行运行计算(使用foreach ... %dopar%) - N我的机器上有多少核心.为此,我使用future:

library(doFuture)
registerDoFuture()
plan(multiprocess)

foreach(i = seq_len(N)) %dopar% {
    foo <- rnorm(1e6)
}
Run Code Online (Sandbox Code Playgroud)

这就像一个魅力,因为我N并行运行计算.但是我需要实现另一个使用大量内核的分析步骤(例如,N).这是代码的样子:

foreach(i = seq_len(N)) %dopar% {
    foo <- rnorm(1e6)
    write.table(foo, paste0("file_", i, ".txt"))
    # This step uses high number of cores 
    system(paste0("head ", "file_", i, ".txt", " > ", "file_head_", i, ".txt")
}
Run Code Online (Sandbox Code Playgroud)

我在运行多个rnormhead并行,但由于head使用了大量的内核(让我们假设这个)我的分析卡住.

题:

如何使用并行运行部分代码future?(如何仅rnorm并行运行然后head顺序运行)?有没有使用另一个循环的解决方案?或者我应该切换到doSNOWparallel

PS:

我的真实代码看起来更像是这样的:

library(doFuture)
library(dplyr)
registerDoFuture()
plan(multiprocess)

foreach(i = seq_len(N)) %dopar% {
    step1(i) %>%
        step2() %>%
        step3() %>%
        step4_RUN_SEQUENTIAL() %>% # I want to run this part not in parallel
        step5() # I want to run this part again in parallel
}
Run Code Online (Sandbox Code Playgroud)

@Andrie的回应评论:

  1. future()是我在R中执行并行计算的方法.我是新手,并且发现它最容易使用(与例如相比parallel::mcapply).但是,如果有可能做我想做的doSNOW还是parallel那我更乐意切换
  2. 我知道这一点,但我正在寻找单回路的解决方案