2

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

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

我在linux上

4

3 回答 3

4

我建议对foreach包使用doParallel后端。foreach 包提供了一个很好的语法来编写循环并负责组合结果。doParallel 将其连接到自 R 2.14 起包含的并行包。在其他设置(旧版本的 R、集群等)上,您可以简单地更改后端,而无需触及任何 foreach 循环。特别是 foreach 包有很好的文档,所以它真的很容易使用。

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

于 2012-06-24T14:12:09.280 回答
3

您没有提供可重复的示例,所以我正在编造一个。正如你在 Linux 上一样,我也喜欢 littler,毕竟它是为使用 R编写脚本而编写的。

#!/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 以了解有关&mfgbgbackground 等的更多信息。

最后,所有这一切都可以 a) 虽然选择参数略有不同,但也可以完成,Rscriptb) 有 CRAN 包getoptoptparse以方便使用命令行参数。

于 2012-06-24T14:43:30.327 回答
1

最先进的方法是使用并行包,但是当我懒惰时,我只需使用 rscript 启动 6 个批处理(cmd,假设为 Windows)文件。

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

SET ARG1="myfile"
rscript rest.r

并从中读取

Sys.getenv("ARG") 

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

于 2012-06-24T13:20:57.230 回答