foreach%dopar%使用PSock群集的顺序工作者设置?

SFu*_*n28 9 r

我注意到foreach /%dopar%在并行执行任务之前执行集群的顺序而非并行设置.如果每个工人需要一个数据集,它需要N秒到数据集传送到工人,然后的foreach /%dopar%花费#workers * N seconds设置时间.这对于大量工作人员或大型N(要传输的大型数据集)非常重要.

我的问题是这是设计还是存在一些我在foreach中或者在集群生成中缺少的参数/设置?

建立

  • R 2.15.2
  • 最新版本的foreach/parallel/doParallel截至今日(2013年7月1日)
  • Windows 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 ] )
}
Run Code Online (Sandbox Code Playgroud)

SFu*_*n28 4

感谢革命计算公司的 Rich 帮助解决了这个问题......

clusterCall使用 for 循环将数据发送给每个工作人员。因为 R 不是多线程的,所以 for 循环必须是顺序的。

有一些解决方案(这需要有人对它们进行编码)。R 可以调用 C/C++ 来线程化工作设置。或者工作人员可以从磁盘上的文件中提取数据。或者工作人员可以在同一个套接字上侦听,而主设备可以只向套接字写入一次并将数据广播给所有工作人员。