0 parallel-processing foreach r plyr
我刚刚开始在 R 中使用 foreach 和 %dopar% 方法进行并行处理,但是我得到的结果令人困惑,并且与 for 循环不同;这是我用来测试这些方法和得到的结果的代码:
library(plyr); library(doParallel); library(foreach)
cs <- makeCluster(2)
registerDoParallel(cs)
sfor_start <- Sys.time()
s_for=as.numeric()
for (i in 1:1000) {
s_for[i] = sqrt(i)
}
print(Sys.time() - sfor_start)
sdopar_start <- Sys.time()
sdopar=as.numeric()
foreach(k=1:1000) %dopar% {
sdopar[k] = sqrt(k)
}
print(Sys.time() - sdopar_start)
Run Code Online (Sandbox Code Playgroud)
结果如下:
> s_for[1:10]; sdopar[1:10]
[1] 1.000000 1.414214 1.732051 2.000000 2.236068 2.449490 2.645751 2.828427 3.000000 3.162278
[1] NA NA NA NA NA NA NA NA NA NA
Run Code Online (Sandbox Code Playgroud)
提前致谢 :)
在说函数不起作用之前,请先阅读函数的文档。
foreach工作起来更像是一个lapply而不是一个for循环。
因此,例如,foreach(k=1:1000) %dopar% sqrt(k)给出与 相同的结果lapply(1:1000, sqrt)。
foreach 然而,使用SEQUENTIALLY时确实可以修改全局变量。然而,当使用并行性时,向量sdopar会被复制到每个“集群”,以便您修改副本,而不是初始对象。
因此,您必须按照@ChiPak 中提到的选项.combine = c或do.call(sdopar, c)之后使用进行操作。
PS:始终初始化您迭代填充的向量(为了提高不增长向量的效率),例如这样:s_for <- double(1000)。
| 归档时间: |
|
| 查看次数: |
8009 次 |
| 最近记录: |