2

test.R引数を取りarg1、ファイルarg2を出力するスクリプトがありarg1-arg2.csvます。

test.R を 6 つの並列セッション (私は 6 コア CPU を使用しています) でバックグラウンドで実行したいと思います。どうすればいいですか?

私は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 を使用しているので、Rでスクリプトを作成する目的で書かれた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)

次に、ここで行っているようにコマンドラインから、または別の (シェル) スクリプトからこれを起動できます。キーは&、バックグラウンドで送信するための最後にあります。

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$ 

&mfgbgbackground などの詳細については、Unix シェルを参照してください。

最後に、これはすべて、 a) 引数の選択が少し異なりますが、b)コマンドライン引数の操作を容易にするRscriptCRAN パッケージのgetoptoptparseを使用して実行できます。

于 2012-06-24T14:43:30.327 に答える
1

最先端のツールは parallel パッケージを使用することですが、怠け者のときは、rscript を使用して 6 つのバッチ (Windows の場合は cmd) ファイルを開始するだけです。

コマンドファイルでパラメーターを設定できます

SET ARG1="myfile"
rscript rest.r

そしてそれを読む

Sys.getenv("ARG") 

6 つのバッチ ファイルを使用して、複数の実行を 1 つのバッチに追加して、コアが常にビジーであることを確認することもできます。

于 2012-06-24T13:20:57.230 に答える