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

时间:2013-01-07 16:05:05

标签: r

问题

我注意到,在并行执行任务之前,foreach /%dopar%执行顺序,而不执行群集的并行 setup 。如果每个工作人员都需要一个数据集,并且需要N秒才能将数据集传输给工作人员,那么foreach /%dopar%将花费#workers * N seconds setup 时间。这对于大量工作人员或大型N(要传输的大型数据集)非常重要。

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

设置

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

1 个答案:

答案 0 :(得分:3)

感谢Rich在Revolution Computing帮助这个......

clusterCall使用for循环向每个worker发送数据。因为R不是多线程的,所以for循环必须是顺序的。

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