3

並列計算に Snowfall 1.84 パッケージを使用しています。計算中に各ワーカーがデータを個別のファイルに書き込むようにしたいと考えています。これは可能ですか?もしそうならどのように?

sfInit( parallel=TRUE, ...,type="SOCK" ) などの「SOCK」タイプの接続を使用しており、コードをプラットフォームに依存しない (unix/windows) にしたいと考えています。

sfInit で「slaveOutfile」オプションを使用して、ログ ファイルを書き込むファイルを定義できることはわかっています。ただし、これはデバッグ目的のためのものであり、すべてのスレーブ/ワーカーは同じファイルを使用する必要があります。各ワーカーに独自の出力ファイルが必要です!!!

書き込む必要があるデータは大きなデータフレームであり、単純な診断メッセージではありません。これらのデータフレームはスレーブによって出力される必要があり、マスター プロセスに送り返すことができませんでした。誰も私がこれを成し遂げることができる方法を知っていますか?

ありがとう

4

1 に答える 1

0

簡単な解決策はsfClusterApply、各ワーカーで異なるファイルを開く関数を実行し、結果のファイル オブジェクトをグローバル変数に割り当てて、後続の並列操作で書き込むことができるようにすることです。

library(snowfall)
nworkers <- 3
sfInit(parallel=TRUE, cpus=nworkers, type='SOCK')
workerinit <- function(datfile) {
  fobj <<- file(datfile, 'w')
  NULL
}
sfClusterApply(sprintf('worker_%02d.dat', seq_len(nworkers)), workerinit)

work <- function(i) {
  write.csv(data.frame(x=1:3, i=i), file=fobj)
  i
}
sfLapply(1:10, work)
sfStop()
于 2014-01-06T15:18:21.193 に答える