3

Windows で実行中の R のインスタンスの数を検出して、スクリプトが特定のスクリプト セットを実行するかどうかを選択できるようにするために作成中の r コードがあります (つまり、R のインスタンスが既に 2 つ以上ある場合)。 do X を実行し、それ以外の場合は Y)。

R内でこれを行う方法はありますか?

編集: 要求された目的に関する情報を次に示します。数千のケースで catnet ライブラリを使用してベイジアン ネットワーク モデルを適用するための非常に長いスクリプト セットがあります。このコードは、ケースごとに結果を処理して csv ファイルに出力します。私が試した並列コンピューティングの代替手段のほとんどは、組み込みの進行状況通知の多くを抑制するため、理想的ではありませんでした。そのため、R のさまざまなインスタンスでケースのサブセットを実行してきました。しかし、それは私にとってはうまくいくので、実行中のインスタンスの数に基づいてコードがケースの数を自動的にサブセット化する方法が必要でした. CMDでRscriptの複数のインスタンスを開いて、わずかに異なる構成のrファイルを開いて、次のようなものを取得することにより、これを手動で行います。 ここに画像の説明を入力

cd "Y:\code\BN_code"
START "" "C:\Program Files\R\R-3.0.0\bin\x64\Rscript.exe" "process spp data3.r" /b
START "" "C:\Program Files\R\R-3.0.0\bin\x64\Rscript.exe" "process spp data3_T1.r" /b
START "" "C:\Program Files\R\R-3.0.0\bin\x64\Rscript.exe" "process spp data3_T2.r" /b
START "" "C:\Program Files\R\R-3.0.0\bin\x64\Rscript.exe" "process spp data3_T3.r" /b

EDIT2:

以下の回答のおかげで、これが私が R で「貧乏人の並列コンピューティング」と呼んでいるものの実装です。したがって、ケースの長いリストに適用する必要がある長いスクリプトがある場合は、以下のコードを使用して長いリストをrscript の各インスタンスに供給されるサブリストの数:

#the cases that I need to apply my code to:
splist=c("sp01", "sp02", "sp03", "sp04", "sp05", "sp06", "sp07", "sp08", "sp09", "sp010", "sp11", "sp12", 
         "sp013", "sp014", "sp015", "sp16", "sp17", "sp018", "sp19", "sp20", "sp21", "sp22", "sp23", "sp24")
###automatic subsetting of cases based on number of running instances of r script:
cpucores=as.integer(Sys.getenv('NUMBER_OF_PROCESSORS'))
n_instances=length(system('tasklist /FI "IMAGENAME eq Rscript.exe" ', intern = TRUE))-3
jnk=length(system('tasklist /FI "IMAGENAME eq rstudio.exe" ', intern = TRUE))-3
if (jnk>0)rstudiorun=TRUE else rstudiorun=FALSE 

if (!rstudiorun & n_instances>0 & cpucores>1){ #if code is being run from rscript and 
#not from rstudio and there is more than one core available
  jnkn=length(splist)
  jnk=seq(1,jnkn,round(jnkn/cpucores,0))
  jnk=c(jnk,jnkn)
  splist=splist[jnk[n_instances]:jnk[n_instances+1]]
}
###end automatic subsetting of cases

#perform your script on subset of list of cases:
for(sp in splist){
  ptm0 <- proc.time()
  Sys.sleep(6)  
  ptm1=proc.time() - ptm0
  jnk=as.numeric(ptm1[3])
  cat('\n','It took ', jnk, "seconds to do species", sp)
}

Windows で r の複数のインスタンスでこのコードを自動的に実行するには、.bat ファイルを作成します。

cd "C:\Users\lfortini\code\misc code\misc r code"
START "" "C:\Program Files\R\R-3.0.0\bin\x64\Rscript.exe" "rscript_multiple_instances.r" /b
timeout 10
START "" "C:\Program Files\R\R-3.0.0\bin\x64\Rscript.exe" "rscript_multiple_instances.r" /b
timeout 10
START "" "C:\Program Files\R\R-3.0.0\bin\x64\Rscript.exe" "rscript_multiple_instances.r" /b
timeout 10
START "" "C:\Program Files\R\R-3.0.0\bin\x64\Rscript.exe" "rscript_multiple_instances.r" /b
exit

タイムアウトは、r が独自のインスタンス数を検出するのに十分な時間を与えるために存在します。この .bat ファイルをクリックすると、r スクリプトの多数のインスタンスが自動的に開きます。各インスタンスは、分析したいケースの特定のサブセットを引き受けますが、各ウィンドウでスクリプトの実行の進行状況をすべて提供します。上の画像。このアプローチの優れた点は、コードで使用している反復メカニズム (ループ、fx の適用など) の前に、自動化されたリストのサブセット化コードを平手打ちするだけでよいことです。次に、.batを使用するか手動でrcriptを使用してコードを起動するだけで、設定は完了です。

4

2 に答える 2

8

Windowsにはここtasklistにある素晴らしい機能が付属しているため、実際には予想よりも簡単です。

Rscript.exeこれを使用すると、実行中のすべてのプロセスを取得して、インスタンスの数を数えるだけで済みます (stringrここでは文字列操作に使用します)。

require(stringr)
progs <- system("tasklist", intern = TRUE)
progs <- vapply(str_split(progs, "[[:space:]]"), "[[", "", i = 1)
sum(progs == "Rscript.exe")

これでうまくいくはずです。(私はのインスタンスを数えて試しただけですRgui.exeが、うまくいきます。)

于 2013-04-10T23:14:45.190 に答える
4

以下のようにさらに短くすることができます

length(grep("rstudio\\.exe", system("tasklist", intern = TRUE)))

他のプロセス名または他のプロセス名rstudioに置き換えますRscript

またはさらに短い

length(system('tasklist /FI "IMAGENAME eq Rscript.exe" ', intern = TRUE))-3

于 2013-04-11T02:34:14.650 に答える