我正在尝试通过将测试数据集(n = 35000)拆分并让R在较小的块上运行来加速测试数据集的预测。 (此外,party
对35k行的cforest预测不起作用,因为我的RAM不够。这是另一件我不理解的事情,但是很好......)
但是,在尝试将foreach
与%dopar%
一起使用时,我无法让R计算最小的部分。
我的预测功能大约需要7秒
predict(fit,newdata=a[1:100,])
和foreach(i=1:10) %do% {predict(fit,newdata=a[1:10,])}
。
但是当我尝试使用%dopar%
时,R似乎会冻结。
不应该:
foreach(i=1:10, .packages=c('party')) %dopar% {predict(fit,newdata=a[1:10,])}
更快?或者并行化本身是否会以某种方式降低R?
使用其他函数测试运行(按建议here重复计算sqrt(3))已经显示出显着的改进,因此%dopar%
也正在运行。
使用randomForest的预测行为相似,不同之处在于,对于10x1:10预测,这里甚至%do%
比预测1:100需要更多的时间
对于randomForest,我并不在乎,因为无论如何预测所有35k数据集都不是问题。
顺便说一句。它只有我,还是cforest为一切花费更多的时间和内存?只有在randomForest像魅力一样工作时才会遇到麻烦。
(在Windows 7,x64,8GB RAM,4核/ 8线程上运行 - 在doSNOW并行化集群中使用6个节点)
答案 0 :(得分:0)
您的示例的主要问题是foreach会自动将整个a
数据框导出到每个工作人员。相反,尝试类似:
library(itertools)
foreach(1:10, suba=isplitRows(a, chunkSize=10), .packages='party') %dopar% {
predict(fit, newdata=suba)
}
1:10
用于测试目的,将循环限制为仅10次迭代,就像您在示例中所做的那样。
这仍然需要将fit
导出到所有工作人员,并且可能非常大。但由于任务比工作人员多得多,如果predict
与发送测试数据的时间相比需要足够的时间,那么并行化预测可能是值得的。