2

我试图通过拆分测试数据集(n = 35000)并让 R 在较小的块上运行来加快对测试数据集(n = 35000)的预测。该模型是用 生成的party::cforest

foreach但是,在尝试使用with时,我无法让 R 计算即使是最小的部分%dopar%

predict(fit,newdata=a[1:100,])我的预测函数对于和都需要大约 7 秒 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 速度?

使用另一个函数进行测试运行(按照此处的建议重复计算 sqrt(3) )已显示出显着的改进,因此%dopar%也可以正常工作。

使用 randomForest 进行预测的行为类似,不同之处在于,即使%do%对于 10x1:10 的预测,也比仅预测 1:100 需要更多的时间。对于 randomForest,我并不关心,因为无论如何预测所有 35k 数据集都不是问题。顺便提一句。只有我,还是 cforest 需要更多时间和内存来完成所有事情?只有在 randomForest 像魅力一样工作时遇到麻烦..

(在 Windows 7、x64、8GB RAM、4 核/8 线程上运行 - 在 doSNOW 并行化集群中使用 6 个节点)

4

1 回答 1

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与发送测试数据的时间相比需要足够的时间,那么并行化预测可能是值得的。

于 2013-03-14T18:34:56.943 回答