9

質問

foreach/%dopar% は、タスクを並行して実行する前に、クラスターの並行セットアップではなく順次セットアップを実行することに気付きました。各ワーカーがデータセットを必要とし、そのデータセットをワーカーに転送するのに N 秒かかる場合、 foreach/%dopar% はセットアップ時間を費やします。これは、多数のワーカーまたは大きな N (転送する大きなデータセット) の場合に重要になる可能性があります。#workers * N seconds

私の質問は、これが設計によるものなのか、それとも foreach またはクラスター生成で欠落しているパラメーター/設定があるのか​​ということです。

設定

  • R 2.15.2
  • 本日 (2013 年 1 月 7 日) 時点での foreach/parallel/doParallel の最新バージョン
  • ウィンドウズ 7 x64

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

# lots of data
data = eval( rnorm( 100000000 ) )

# make cluster/register - creates 6 nodes fairly quickly
cluster = makePSOCKcluster( 6 , outfile = "" )
registerDoParallel( cluster  )

# fire up Task Manager.  Observer that each node recieves data sequentially.
# When last node gets data, then all nodes process at the same time
results = foreach( i = 1 : 500 )  %dopar%
{
    print( data[ i ] )
    return( data[ i ] )
}
4

1 に答える 1

4

これを手伝ってくれたRevolutionComputingのRichに感謝します。

clusterCallforループを使用して、各ワーカーにデータを送信します。Rはマルチスレッドではないため、forループはシーケンシャルである必要があります。

いくつかの解決策があります(誰かがそれらをコード化する必要があります)。RはC/C ++を呼び出して、ワーカーのセットアップをスレッド化できます。または、ワーカーがディスク上のファイルからデータをプルすることもできます。または、ワーカーが同じソケットでリッスンし、マスターがソケットに1回だけ書き込み、データをすべてのワーカーにブロードキャストすることもできます。

于 2013-01-14T03:57:51.573 に答える