在后台并行会话中运行R脚本

时间:2012-06-24 12:28:02

标签: r parallel-processing

我有一个脚本test.R,它接受​​参数arg1arg2并输出arg1-arg2.csv文件。

我想在6个并行会话中运行test.R(我在6核CPU上)并在后台运行。我该怎么办?

我在linux上

3 个答案:

答案 0 :(得分:4)

我建议将doParallel后端用于foreach包。 foreach包提供了一个很好的语法来编写循环并负责组合结果。 doParallel将它连接到自R 2.14以来包含的parallel包。在其他设置(旧版本的R,群集,无论如何)上,您只需更改后端而不触及任何foreach循环。 foreach软件包特别具有出色的文档,因此非常易于使用。

如果要将结果写入单个文件,则foreach的结果组合功能对您没有多大用处。所以人们可能会争辩说直接使用并行将更适合您的应用程序。就个人而言,我发现foreach表达循环概念的方式更容易使用。

答案 1 :(得分:3)

你没有提供可重复的例子,所以我正在制作一个。当你在Linux上的时候,我也很喜欢littler,这毕竟是为了编写的目的而写的。

#!/usr/bin/env r
#
# a simple example to install one or more packages

if (is.null(argv) | length(argv) != 2) {
    cat("Usage: myscript.r arg1 arg2\n")
    q()
}

filename <- sprintf("%s-%s.csv", argv[1], argv[2])
Sys.sleep(60)   # do some real work here instead
write.csv(matrix(rnorm(9), 3, 3), file=filename)

然后您可以像我这样从命令行或从另一个(shell)脚本中获取此信息。关键是最后&在后​​台发送它:

edd@max:/tmp/tempdir$ ../myscript.r a b &
[1] 19575
edd@max:/tmp/tempdir$ ../myscript.r c d &
[2] 19590
edd@max:/tmp/tempdir$ ../myscript.r e f &
[3] 19607
edd@max:/tmp/tempdir$

[$n]表示如何在后台启动进程,后面的数字是您可以用来监视或终止的进程ID。过了一会儿,我们得到了结果:

edd@max:/tmp/tempdir$ 
[1]   Done                    ../myscript.r a b
[2]-  Done                    ../myscript.r c d
[3]+  Done                    ../myscript.r e f
edd@max:/tmp/tempdir$ ls -ltr
total 12
-rw-rw-r-- 1 edd edd 192 Jun 24 09:39 a-b.csv
-rw-rw-r-- 1 edd edd 193 Jun 24 09:40 c-d.csv
-rw-rw-r-- 1 edd edd 193 Jun 24 09:40 e-f.csv
edd@max:/tmp/tempdir$ 

您可能需要阅读Unix shell,以了解有关&fg背景等bg的更多信息。

最后,所有这些都可以a)也可以使用Rscript完成虽然选择参数略有不同,并且b)有CRAN包getoptoptparse以便于使用命令行参数。

答案 2 :(得分:1)

现有技术将是使用并行包,但是当我懒惰时,我只需用rscript启动6批(cmd,假设是Windows)文件。

您可以在cmd文件中设置参数

SET ARG1="myfile"
rscript rest.r

并从

中读取
Sys.getenv("ARG") 

使用6个批处理文件,我还可以在一个批处理中附加多个运行,以确保核心始终处于忙碌状态。