2

Linux クラスターでバッチ モードでさまざまな R スクリプトを一度に実行して、さまざまなデータ セットのモデルを推定しています (Mac で実行した場合にも発生します)。スクリプトは、使用しているデータ セットを除いてまったく同じです。それを行うと、次のメッセージが表示されます。

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

再現可能な例を次に示します。2 つのファイル tmp1.R と tmp2.R、および tmp.sh を次の内容で作成します。

ファイル tmp1.R および tmp2.R の内容:

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)

tmp.sh ファイルの内容:

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

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

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

4

1 に答える 1

2

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

# 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)
})

データを各ノードで永続化したい場合は、その後の分析に使用できます。

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

これにより、df各ノードにそのノードに固有のデータ フレームが作成されます。

于 2016-10-27T01:43:55.237 に答える