3

背景/动机:我正在运行一个生物信息学管道,如果从头到尾线性执行,则需要几天才能完成。幸运的是,有些任务不相互依赖,因此可以单独执行。例如,任务 2、3 和 4 都依赖于任务 1 的输出,但彼此不需要信息。任务 5 使用 2、3 和 4 的输出作为输入。

我正在尝试编写一个脚本,该脚本将为三个任务中的每一个打开 R 的新实例并同时运行它们。一旦这三个都完成了,我就可以继续剩下的管道了。

对于更线性的工作流程,我过去所做的是拥有一个“主”脚本,该脚本依次获取(source())每个任务的下标。

我已经搜索了 SO 和 google,但无法找到解决这个特定问题的方法。希望大家能帮忙。

在 R 中,您可以运行system()以在终端中调用命令并打开以打开文件。例如,以下将打开一个新的终端实例:

system("open -a Terminal .",wait=FALSE)

同样,我可以通过使用开始一个新的 r 会话

system("open -a r .")

我一生无法弄清楚的是如何设置“输入”参数,以便它获取我的脚本之一。例如,我希望以下内容打开一个新的终端实例,在新实例中调用 r,然后获取脚本。

system("open -a Terminal .",wait=FALSE,input=paste0("r; source(\"/path/to/script/M_01-A.R\",verbose=TRUE,max.deparse.length=Inf)"))
4

2 回答 2

1

如果其他人对此感兴趣,请回答我自己的问题。

经过几天的工作,我认为执行此工作流程的最佳方法是不要将自己限制在仅在 R 中工作。编写 bash 脚本提供了更大的灵活性,并且可能是一个更直接的解决方案。以下示例是在另一个网站上向我建议的。

#!/bin/bash

# Run task 1
Rscript Task1.R

# now run the three jobs that use Task1's output
# we can fork these using '&' to run in the background in parallel
Rscript Task2.R &
Rscript Task3.R &
Rscript Task4.R &

# wait until background processes have finished
wait %1 %2 %3

Rscript Task5.R
于 2017-02-14T13:29:26.360 回答
1

你可能对未来的包感兴趣(我是作者)。它允许您将代码编写为:

library("future")

v1 %<-% task1(args_1)

v2 %<-% task2(v1, args_2)
v3 %<-% task3(v1, args_3)
v4 %<-% task4(v1, args_4)

v5 %<-% task5(v2, v3, v4, args_5)

这些v %<-% expr语句中的每一个都基于 R 表达式expr(及其所有依赖项)创建一个未来,并将其分配给一个 promise v。只有在v使用时,才会阻塞并等待值v可用。

这些期货的解决方式和地点由上述代码的用户决定。例如,通过指定:

library("future")
plan(multiprocess)

在顶部,然后在您的本地计算机上并行解决期货(= 不同的任务)。如果你使用,

plan(cluster, workers = c("n1", "n3", "n3", "n5"))

它们在机器上得到解决(n3接受两个并发作业)。

这适用于所有操作系统(包括 Windows)。

如果您可以使用 Slurm、SGE 和 TORQUE / PBS 等调度程序访问 HPC 计算,则可以使用future.BatchJobs 包,例如

plan(future.BatchJobs::batchjobs_torque)

PS。创造未来的一个原因是并行/分布式做大规模的生物信息学。

于 2017-03-06T16:45:40.567 回答