Den*_*lle 4 windows parallel-processing r rscript rstudioapi
我需要如何运行脚本的安排是首先使用该函数并行运行 4 个 R 脚本rstudioapi::jobRunScript()。并行运行的每个脚本不会从任何环境导入任何内容,而是将创建的数据帧导出到全局环境。我的第 5 个 R 脚本基于并行运行的 4 个 R 脚本创建的数据帧,并且第 5 个脚本也在控制台中运行。如果有一种方法可以在前 4 个 R 脚本并行运行完成后在后台而不是在控制台中运行第 5 个脚本,那就会好很多。我还试图减少整个过程的总运行时间。
尽管我能够弄清楚如何并行运行前 4 个 R 脚本,但我的任务尚未完全完成,因为我找不到如何触发运行第 5 个 R 脚本的方法。希望大家能在这里帮助我
这对我来说有点太开放了。虽然rstudioapi绝对可以用于运行并行任务,但它的用途不是很广泛,并且不会为您提供非常有用的输出。Universeparallel在 R 中得到了很好的实现,有几个包提供了更简单、更好的接口来实现这一点。这里有 3 个选项,它们还允许从不同的文件中“输出”某些内容。
通过并行包,我们可以非常简单地实现这一点。只需创建要获取的文件向量并source在每个线程中执行即可。主进程在运行时将锁定,但如果您必须等待它们完成,那么这并不重要。
library(parallel)
ncpu <- detectCores()
cl <- makeCluster(ncpu)
# full path to file that should execute
files <- c(...)
# use an lapply in parallel.
result <- parLapply(cl, files, source)
# Remember to close the cluster
stopCluster(cl)
# If anything is returned this can now be used.
Run Code Online (Sandbox Code Playgroud)
附带说明一下,几个包具有与该parallel包类似的接口,该接口是在该包的基础上构建的snow,因此这是一个很好的了解基准。
包的另一种选择parallel是包foreach,它提供了类似于for-loop接口的东西,简化了接口,同时提供了更大的灵活性,并自动导入必要的库和变量(尽管手动执行此操作更安全)。
然而,该foreach软件包确实依赖于parallel和doParallel软件包来设置集群
library(parallel)
library(doParallel)
library(foreach)
ncpu <- detectCores()
cl <- makeCluster(ncpu)
files <- c(...)
registerDoParallel(cl)
# Run parallel using foreach
# remember %dopar% for parallel. %do% for sequential.
result <- foreach(file = files, .combine = list, .multicombine = TRUE) %dopar% {
source(file)
# Add any code before or after source.
}
# Stop cluster
stopCluster(cl)
# Do more stuff. Result holds any result returned by foreach.
Run Code Online (Sandbox Code Playgroud)
虽然它确实添加了几行代码,但.combine,.packages和.export为 R 中的并行计算提供了一个非常简单的接口。
现在,这是比较罕见的软件包之一。future提供比两者更灵活的并行接口parallel,并foreach允许异步并行编程。然而,实现似乎有点令人畏惧,而我在下面提供的示例只是触及了可能的表面。
另外值得一提的是,虽然该future包确实提供了运行代码所需的函数和包的自动导入,但经验使我意识到这仅限于任何调用中的第一级深度(有时更少),因为这样的导出仍然是必要的。
虽然foreach依赖parallel(或类似)启动集群,但foreach将使用所有可用核心启动集群本身。一个简单的调用plan(multiprocess)将启动一个多核会话。
library(future)
files <- c(...)
# Start multiprocess session
plan(multiprocess)
# Simple wrapper function, so we can iterate over the files variable easier
source_future <- function(file)
future(file)
results <- lapply(files, source_future)
# Do some calculations in the meantime
print('hello world, I am running while waiting for the futures to finish')
# Force waiting for the futures to finish
resolve(results)
# Extract any result from the futures
results <- values(results)
# Clean up the process (close down clusters)
plan(sequential)
# Run some more code.
Run Code Online (Sandbox Code Playgroud)
乍一看,这可能看起来相当沉重,但一般机制是:
plan(multiprocess)future使用(或%<-%,我不会详细介绍)执行某些函数resolve,它适用于列表(或环境)中的单个 future 或多个 futurevalue单个 future 或多个 future的结果valuesfuture使用以下命令清除环境中运行的所有集群plan(sequential)我相信这 3 个包为任何用户需要交互的多处理(至少在 CPU 上)的每个必要元素提供了接口。其他包提供替代接口,而对于异步,我只知道future和promises。一般来说,我建议大多数用户在进行异步编程时要非常小心,因为这可能会导致一系列与同步并行编程相比不太常见的问题。
我希望这可能有助于提供(非常有限的)接口的替代方案rstudioapi,我相当确定该接口从来不打算由用户自己用于并行编程,但更可能是用于执行诸如并行构建包之类的任务界面本身。