【发布时间】:2012-12-21 09:32:12
【问题描述】:
问题
我注意到 foreach/%dopar% 在并行执行任务之前执行顺序,而不是并行设置集群。如果每个工作人员都需要一个数据集,并且将数据集传输给工作人员需要 N 秒,那么 foreach/%dopar% 将花费#workers * N seconds of 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 ] )
}
【问题讨论】:
-
“顺序设置”是我在不使用共享内存集群的情况下遇到的唯一一种行为。如果有一种方法可以在没有共享内存的情况下加快速度,我也会非常感兴趣。但是,由于
clusterExport()(通过clusterCall())是按顺序执行的,我想在那之前我不会屏住呼吸。 -
Ben - 你能详细说明一下吗?请原谅我对与操作系统/内存相关的事情的无知……在示例中,有 6 个子进程,我认为有机会并行向它们发送数据。是不是父进程只能按顺序访问该内部数据?
-
这已经接近我对集群通信知识的局限了,但是在类似unix的系统上,可以
fork一个进程,允许子进程访问父进程中加载的对象,只能复制那些被修改的。 Windows 机器不具备这种特殊功能,并且对于我使用过的所有集群类型(不是全部),集群设置都是按顺序进行的。 -
本 - 谢谢!希望有人插话并行执行此操作的可能性。或者您观察到这一直是连续的,也许是因为没有其他方法可以做到这一点。
标签: r