我有一个脚本test.R
,它接受参数arg1
,arg2
并输出arg1-arg2.csv
文件。
我想在6个并行会话中运行test.R(我在6核CPU上)并在后台运行。我该怎么办?
我在linux上
答案 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包getopt和optparse以便于使用命令行参数。
答案 2 :(得分:1)
现有技术将是使用并行包,但是当我懒惰时,我只需用rscript启动6批(cmd,假设是Windows)文件。
您可以在cmd文件中设置参数
SET ARG1="myfile"
rscript rest.r
并从
中读取Sys.getenv("ARG")
使用6个批处理文件,我还可以在一个批处理中附加多个运行,以确保核心始终处于忙碌状态。