2016-10-27 25 views
0

私は別のデータセットのモデルを推定するために、Linuxクラスタで異なるRスクリプトを一度にバッチモードで実行しています。スクリプトは、使用しているデータセットを除いてまったく同じです。私はそれをすると次のメッセージを受け取ります。並列処理でエラーが発生しました:ポートを開くことができません

Error in socketConnection("localhost", port = port, server = TRUE, blocking = TRUE, : 
cannot open the connection 
Calls: makePSOCKcluster -> newPSOCKnode -> socketConnection 
In addition: Warning message: 
In socketConnection("localhost", port = port, server = TRUE, blocking = TRUE, : 
port 11426 cannot be opened 

これは再現可能な例です。二つのファイル、tmp1.Rとtmp2.Rを作成し、コンテンツをtmp.sh:tmp.shファイルの

library(dclone) 
l <- list(1:100,1:100,1:100,1:100) 
cl <- makePSOCKcluster(4) 
parLapply(cl, X=l, fun=function(x) {Sys.sleep(2); sum(x); }) 
stopCluster(cl) 

内容:ファイルtmp1.Rとtmp2.Rの

コンテンツ:

#!/bin/sh 
R CMD BATCH tmp1.R & 
R CMD BATCH tmp2.R & 

リストの最初のファイルが実行されます。 2番目は上記のエラーを表示します。誰かがそれを解決する方法を知っていて、手動介入なしですべてのスクリプトを一度に自動的に実行しますか?

PS:他のすべての同様の質問を読みましたが、上記の質問に対する再現可能な例や答えはありません。

+1

なぜ2つのクラスタを同時に起動しますか? –

+0

答えが正確ではありません...しかし、なぜローカルホスト上でコードを実行している場合、SOCKクラスタを使用していますか? linux/macでは、fork-clusters(または単にmclapply)を使うことができます。 –

+0

@HongOoiの場合、これは単なるおもちゃの例です。理由はより複雑で、実際のアプリケーションと関係があります。まったく同じこと(つまり、多くのスクリプトを自動的に実行し、それぞれの並列化を使用する)の代替手段は何ですか? – Diogo

答えて

1

複数のデータセットで同じコードを実行するために複数のクラスタを起動する必要はありません。各ノードに正しいデータを送信するだけです。

# make 4 distinct datasets 
df1 <- mtcars[1:8,] 
df2 <- mtcars[9:16,] 
df3 <- mtcars[17:24,] 
df4 <- mtcars[25:32,] 

# make the cluster 
cl <- makeCluster(4) 

clusterApply(cl, list(df1, df2, df3, df4), function(df) { 
    # do stuff with df 
    # each node will use a different subset of data 
    lm(mpg ~ disp + wt, df) 
}) 

あなたは、データが各ノード上で永続的にしたい場合は、あなたがその後の分析のためにそれを使用することができます。これは、各ノード上のdfデータフレームを作成し

clusterApply(cl, list(df1, df2, df3, df4), function(df) { 
    assign("df", df, globalenv()) 
    NULL 
}) 

に固有になりますそのノード。

+0

間接的ではありますが、これは問題を回避するのに役立ちます。ありがとう – Diogo

関連する問題