1

doRedis を使用して R クラスターを作成し、foreach で計算の一部を並列処理しようとしていますが、エラーが発生し続けます。私のコードは foreach %do% で動作しますが、%dopar% でクラスター上で実行しようとすると失敗します。doRedis ドキュメントのサンプル コードも実行してみましたが、これも失敗しました。以下は、メイン スクリプトとワーカーの R コンソールです。

メインの R コンソール:

> require('doRedis')
> registerDoRedis('work')
> getDoParWorkers()
[1] 2
> foreach(j=1:10,.combine=sum,.multicombine=TRUE) %dopar%
+ 4*sum((runif(1000000)^2 + runif(1000000)^2)<1)/10000000
[1] "interrupt: \n"
Error in tryCatchOne(expr, names, parentenv, handlers[[1L]]) : 
  attempt to apply non-function
In addition: Warning message:
In e$fun(obj, substitute(ex), parent.frame(), e$data) :
  Queue length off by 10...correcting

ワーカー コンソール:

> require('doRedis')
> redisWorker('work')
Waiting for doRedis jobs.
Processing job  3  from queue  work 
Error in names(z) <- w[o] : 
  'names' attribute [69] must be the same length as the vector [68]

何がエラーの原因なのかはわかりませんが、ワーカーに送信したすべての結果がこのエラーになるようです:

`Error in names(z) <- w[o] : 
   'names' attribute [69] must be the same length as the vector [68]`

これを修正する方法はありますか?

4

2 に答える 2

1

あなたの例の問題の 1 つは、foreach ループの本体の周りに中かっこを使用していないことです。%dopar%andは二項演算子であるため%do%、foreach ループの本体全体が演算子の正しい引数として扱われるようにする必要があります%dopar%。あなたの場合、 foreach ループの本体は単純4です。中括弧 (または括弧) を使用すると、この問題を解決できます。

foreach(j=1:10,.combine=sum,.multicombine=TRUE) %dopar% {
  4*sum((runif(1000000)^2 + runif(1000000)^2)<1)/10000000
}

しかし、本当の問題は、redis ワーカーがredisInfo関数を呼び出して redis サーバーのバージョンを判別するときに発生するようです。redisInfoサーバーからの「INFO」出力が解析されるときにエラーが発生し、ワーカーが失敗すると思います。私の推測では、別の redis サーバーをインストールすると、「INFO」出力が変更され、redisInfo のバグがトリガーされなくなり、問題が「修正」されたようです。redisInfoこのエラーが再発しないように機能を改善していただければ幸いです。

于 2014-08-06T13:00:47.717 に答える
0

私は問題を見つけたと思います。brew を使用して redis-server をインストールしました。brew なしで redis-server を再インストールし、構成ファイルでタイムアウトを 0 に設定しました。ジョブを実行すると、ワーカーは次のように出力します。

`Waiting for doRedis jobs.
 Processing job  3  from queue  works 
 Processing task 10 ... from queue works jobID 3 
 Processing job  3  from queue  works 
 Processing task 100 ... from queue works jobID 3 
 Processing job  3  from queue  works 
 Processing task 13 ... from queue works jobID 3 
 Processing job  3  from queue  works 
 Processing task 14 ... from queue works jobID 3 
 Processing job  3  from queue  works 
 Processing task 16 ... from queue works jobID 3 
 Processing job  3  from queue  works 
 Processing task 18 ... from queue works jobID 3 
 Processing job  3  from queue  works 
 Processing task 2 ... from queue works jobID 3 
 Processing job  3  from queue  works 
 Processing task 21 ... from queue works jobID 3 
 [1] "Empty"`

空の文字列が返されますが、関数を記述して foreach に渡す方法にエラーがあるためだと思います。

于 2014-08-06T18:08:07.977 に答える