如果我已经做了registerDoParallel(cl),我还需要makeCluster

时间:2017-08-20 07:12:42

标签: r parallel-processing doparallel

阅读doparallel的小插图。

以下两个代码是否相同?

>>>def change(x): 
...    x.append(len(x))
...    return x
>>>a=[]
>>>b=(change(a) for i in range(3))
>>>next(b)
[0]
>>>next(b)
[0,1]
>>>next(b)
[0,1,2]
>>>next(b)
Traceback ... StopIteration
>>>a=[]
>>>b=(change(a) for i in range(3))
>>>list(b) #expecting [[0],[0,1],[0,1,2]]
[[0,1,2],[0,1,2],[0,1,2]] 

与此基本相同:

library(doparallel)
  no_cores <- 8
  cl <- makeCluster(no_cores) 
  registerDoParallel(cl)
pieces <- foreach(i = seq_len(length(pieces))) %dopar% { # do stuff}

如果我想使用多核,那么在使用doparallel时我必须library(doparallel) registerDoParallel(cores = 8) pieces <- foreach(i = seq_len(length(pieces))) %dopar% { # do stuff} 吗?或者是单行足够makeCluster()

1 个答案:

答案 0 :(得分:2)

在Windows机器上,这两个示例基本相同。唯一的区别是第一个示例使用显式集群对象,第二个示例使用在执行registerDoParallel时创建的隐式集群对象。这两个例子的表现应该是一样的。

在Mac或Linux计算机上,第一个示例使用snow派生的后端(与Windows计算机上完全相同),最终使用clusterApplyLB执行并行计算。第二个示例使用multicore派生的后端(Windows上从未提供),最终使用mclapply执行并行计算,这可能比第一个示例更有效。