假设我有
n
任务,我想使用 foreach
包并行运行。第 i 个任务由 f(dataset_i)
定义,其中 f
是需要时间完成的函数,具体取决于 dataset_i
的大小。
函数
f
本身可以并行化,所以我想将cpu_i
分配给第i个任务,并使用f(dataset_i)
cpu运行cpu_i
。
这样的事情可能吗?如果的话,该怎么做?
R 级并行始终是进程并行。任务未发送至 不同的 CPU 核心,而是在不同的 CPU 核心上运行单独的 R 会话 线程。但重要的是,所有 R 会话仍然可以访问所有 核心。因此,如果您有一个函数
f()
可以在多个任务上执行任务
线程(=单独的核心)通过调用本机代码,您应该指定
启动任务时应使用多少个线程f()
。
具体来说,与
f = data.table::fwrite
:
library(foreach)
library(doParallel)
#> Loading required package: iterators
#> Loading required package: parallel
registerDoParallel()
datasets <- list(
data.frame(foo = rnorm(1e7)),
data.frame(foo = rnorm(2e7))
)
foreach(data = datasets, ncpu = c(1, 2)) %dopar% {
file <- withr::local_tempfile()
data.table::fwrite(data, file, nThread = ncpu) |> system.time()
}
#> [[1]]
#> user system elapsed
#> 0.72 0.06 0.85
#>
#> [[2]]
#> user system elapsed
#> 1.31 0.14 0.78
stopImplicitCluster()