doParallel および foreach パッケージ (OpenMP) を使用してクラスター ノードで R を使用しています。
結果として 2 つのオブジェクトを取得し、それらを RData として保存する最初のスクリプトを実行しました。
別のスクリプトで、さらに処理する 2 つのオブジェクトを含む RData をロードしますが、foreach ループを並列で使用すると、「タスク 1、接続を開くことができません」というメッセージが表示されます。ロードされた RData に問題があるのではないかと疑っていました。
デスクトップコンピューターでこの簡単な作業例を試すことにしました。
1/ 最初にこの単純なコードを実行します。
library("doParallel")
library("foreach")
registerDoParallel(cores=3)
x<-matrix(rnorm(2000),nrow=10,ncol=200)
squarex<-foreach(i=1:10)%dopar%{x[,i]^2}
すべてが機能します
2/次に、以前にクラスターに保存した RData をロードします
load("xxx.RData")
2 つのオブジェクトがそこにあります。
3/2 とはまったく関係のない 1 を再度実行しようとすると、次のエラーが表示されます。
mcfork() のエラー: フォークできません。考えられる理由: メモリを割り当てられません
実際、parallel パッケージを使用するものはすべて機能しなくなりました。コアを登録しようとしても機能せず、ハングアップすることさえあります。
明らかに、クラスター環境から RData に何かがインポートされ、問題が発生したに違いありません。ただし、理由がわからず、クラスターで同じ手順を直接実行しても問題は解決しません。
情報:
データセットをロードする前の ls():
ls()
[1] "squarex" "x"
データセットをロードした後の ls(): ls()
[1] "squarex" "trandom_list_data_Ana_all" "trandom_list_data_Anatem_all"
[4] "x"
trandom_list* はロードされた 2 つのオブジェクトで、それぞれが 8.7Gb です (クラスター ノードには 47Gb があり、私のコンピューターには 32Gb の RAM があります)。
dput(xxx.RData) は、list(structure(c(0, 0, 0, 0, 0.1, 0, 0, 5.2
そして奇妙に終わる
2, 0, 0, 0, 0, 0, 0, 0, 31.5, 11.9, 0.1, 0, 0, 0, 0.1, 0, 2.5, 10.2
それは「)」なしです..プロセスが完了したときにRAMがいっぱいになったため、dputが完全に行われなかった可能性があります(ただし、スワップはまだ問題ありませんでした)。