9

问题

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

我的问题是这是设计使然,还是我在 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

感谢Revolution Computing 的Rich 提供的帮助......

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

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

于 2013-01-14T03:57:51.573 回答