我有一个脚本test.R
,它接受参数arg1
,arg2
并输出一个arg1-arg2.csv
文件。
我想在 6 个并行会话(我在 6 核 CPU 上)和后台运行 test.R。我该怎么做?
我在linux上
我有一个脚本test.R
,它接受参数arg1
,arg2
并输出一个arg1-arg2.csv
文件。
我想在 6 个并行会话(我在 6 核 CPU 上)和后台运行 test.R。我该怎么做?
我在linux上
我建议对foreach包使用doParallel后端。foreach 包提供了一个很好的语法来编写循环并负责组合结果。doParallel 将其连接到自 R 2.14 起包含的并行包。在其他设置(旧版本的 R、集群等)上,您可以简单地更改后端,而无需触及任何 foreach 循环。特别是 foreach 包有很好的文档,所以它真的很容易使用。
如果您要将结果写入单个文件,那么 foreach 的结果组合功能对您没有多大用处。所以人们可能会争辩说直接使用并行会更适合您的应用程序。就我个人而言,我发现 foreach 表达循环概念的方式更易于使用。
您没有提供可重复的示例,所以我正在编造一个。正如你在 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 以了解有关&
mfg
和bg
background 等的更多信息。
最后,所有这一切都可以 a) 虽然选择参数略有不同,但也可以完成,Rscript
b) 有 CRAN 包getopt和optparse以方便使用命令行参数。
最先进的方法是使用并行包,但是当我懒惰时,我只需使用 rscript 启动 6 个批处理(cmd,假设为 Windows)文件。
您可以在 cmd 文件中设置参数
SET ARG1="myfile"
rscript rest.r
并从中读取
Sys.getenv("ARG")
使用 6 个批处理文件,我还可以在一批中追加多个运行,以确保内核始终处于忙碌状态。