2016-05-19 9 views
0

これは狂っていますが、3回発生しました。私は、foreachループを設定している:モニターをオフにすると、並列foreachループが失敗する

library(parallel) 
library(foreach) 
library(doParallel) 

for(j in 1:length(start_times)) { 
    ... 

    cl <- makeCluster(detectCores() - 1, outfile="status.txt") 
    registerDoParallel(cl, cores = detectCores() - 1) 

    assign(paste("master_data",j,sep=""), 
    foreach(i = 1:nrow(start_points_data), .packages=c("doBy","plyr","fossil","geosphere","reshape","rgdal","sp","rgeos","spatialEco","maptools"), .combine=rbind) %dopar% { 

    print(paste(Sys.time(), ": Starting ",i," of ",nrow(start_points_data)," locations.", sep="")) 

    ... 
    }) 
stopCluster(cl) 
} 

(私はこのエラーが私のプロセスが長すぎることによって引き起こされたと思ったので、foreachループを別のループ内にネストされた理由があるので、私はそれを分割。。)

テスト用に私のデータセットを縮小しましたが、私は机の上に座って何度も成功しました。しかし、私は自分のコンピュータがオフの監視オンにした場合、プロセスはこのエラーで停止:

Error in unserialize(socklist[[n]]) : error reading from connection 

foreachループ内のコードの個々の繰り返しは、労働者一人当たりの秒未満をとり、OUTFILEを見て、それは明らかですforeachループまたは親forループの回数が何回であっても、モニターをオフにしてから1分以内に処理が停止します。

Windowsは、モニターがオフになったことを検知したときに何かをシャットダウンしてスマートにしようとしていますか?

+0

"outfile"をファイル名に設定するのは本当に信頼できません。なぜなら、作業者にすべてのファイルを1つのファイルに書き込ませるのはうまくいかないからです。 'outfile =" "'を使うと、死んでいるワーカーからエラーメッセージが出る可能性が高いと思うし、 "コマンドプロンプト"ウィンドウからRtermを使ってプログラムを実行してください。 –

+0

明らかにモニターは問題ではありませんでした。相関が高い場合に過ぎないと思います。 –

答えて

0

最初に、outfile tipのSteveに感謝します。

問題は労働者が死ぬことであった。現在のクラスタを停止して再登録するtryCatch()を実装しました。出力ファイルは親ループが正常終了するたびに書き込まれるため、出力ファイルの数に基づいて中断した部分を処理できます。やや優しいですが、うまくいくようです。

関連する問題