2017-10-26 5 views
0

すべてのエラーメッセージが同じファイルにリダイレクトされるように、マルチセッションの並列処理でRコードを実行しようとしています。ただし、sink()は作成できません。共有stderrリダイレクトを使用するマルチセッションの並列化

library(parallel) 
cl <- makePSOCKcluster(2) 
f <- function(){ 
    withr::with_message_sink("messages.txt", Sys.sleep(10)) 
} 
clusterCall(cl = cl, fun = f) 

## Error in checkForRemoteErrors(lapply(cl, recvResult)) : 
## 2 nodes produced errors; first error: Cannot establish message sink when another sink is active. 
## Calls: clusterCall -> checkForRemoteErrors 
## Execution halted 

編集

応答のいくつかを考えると、私はこの記事の目的について詳しく説明すべきです。複数の並列バックエンドを持つRパッケージdrakeを開発中です。今日、新しいhook argumentmake()に実装しました。wraps individual parallel jobsfunction of the user's choiceです。私が実際に探しているのは、並列バックエンドに関係なくコンソールを消音するhookです。現在の開発バージョンでバックエンドは、

  • parallel::mclapply()
  • parallel::parLapply()
  • base::lapply()適切Makefile
  • future::sequential
  • future::multicore
  • make -j(1つのジョブのparLapply()を介して)
  • future.batchtools backends listed here

私はstderrのために働いhookを見つけたと思いました。

hook <- function(){ 
    withr::with_message_sink("messages.txt", Sys.sleep(10)) 
} 

しかし、withr::with_message_sink()は私がparLapply()またはfuture::multisessionバックエンドのために同じファイルに複数の労働者を沈ませません。

+0

を使用することができます私は、私は同様の必要性/問題/解決策を持っていたと思うが、私は少しより多くの情報を必要としています。 'マルチセッション'とは、同じサーバー上の複数のアクティブセッションを話しているのでしょうか、複数のpidを使用していますか?主な目標は何ですか?私の場合と同じように、複数の大きなジョブを並行して実行する必要がありました。繰り返しを実行するとエラーがスローされますが、tryCatchにエラーが記録されますが、意図的に何かをストールしません... –

+0

私の編集を見てください。自分のニーズは珍しい。あなたのケースでは、[開発用ドレープ](https://github.com/wlandau-lilly/drake)が役に立ちます。エラーメッセージと呼び出しスタックを含む、失敗したターゲットに関する詳細なエラー情報を取得する新しい['diagnose()'関数(https://github.com/wlandau-lilly/drake/issues/114)を実装しました。 – landau

+0

'drake :: failed()'と 'drake :: diagnose()'関数は、コンソールに出力される通常のエラーメッセージの厳密な必要性を取り除きます。私は11月にCRANのアップデートを予定しています。 – landau

答えて

1

あなただけのシンク?:

library(parallel) 
cl <- makePSOCKcluster(2) 
clusterApply(cl, seq_along(cl), function(i) workerID <<- i) 


f <- function(){ 
    outtxt <- paste(workerID, "messages.txt", sep="_") 
    print(outtxt) 
    sink(outtxt) 
    Sys.sleep(10) 
    sink() 
} 
clusterCall(cl = cl, fun = f) 

stopCluster(cl) 
+0

私はある時点で 'outfile'を使用しましたが、私はそうでなければ説得しました(https://github.com/HenrikBengtsson/future/issues/171#issuecomment-339442682)。私の編集を見てください。 – landau

+0

シンクを使用できますか? –

+0

何らかの理由で、以前に試してみるとうまくいきませんでした。しかし、あなたがそれを持ち上げてから、私は 'サイレンサーのフックはここにある '(https://github.com/wlandau-lilly/drake/blob/master/R/hooks)で' make(...、hook = message_sink_hook) 'を試しました.R#L32)、どこでも動作するようです。 – landau

関連する問題