R - 如何并行执行蒙特卡罗模拟的for循环?

时间:2012-01-09 18:47:22

标签: r

我正在尝试研究如何将“数据挖掘与R - 学习与案例研究”中的一些代码并行化,以使其在我的macbook pro上运行得更快。有问题的具体代码如下。该代码基本上使用相同的数据(DS)并应用六种不同的学习者(例如svm,nnet用于回归和分类等)和少量变体。

完整代码为HERE(在“模型评估和选择”部分的底部附近)。

for(td in TODO) {
  assign(td,
     experimentalComparison(
       DSs,         
       c(
         do.call('variants',
                 c(list('singleModel',learner=td),VARS[[td]],
                   varsRootName=paste('single',td,sep='.'))),
         do.call('variants',
                 c(list('slide',learner=td,
                        relearn.step=c(60,120)),
                   VARS[[td]],
                   varsRootName=paste('slide',td,sep='.'))),
         do.call('variants',
                 c(list('grow',learner=td,
                        relearn.step=c(60,120)),
                   VARS[[td]],
                   varsRootName=paste('grow',td,sep='.')))
         ),
        MCsetts)
     )
  # save the results
  save(list=td,file=paste(td,'Rdata',sep='.'))
}

我发现的大多数并行化信息似乎更适用于“应用”之类的事情,其中​​相同的功能应用于数据的不同子集。这段代码的作用恰恰相反 - 不同的函数应用了相同的数据。

并行外部FOR循环是否更好,以便一次为多个学习者运行内部代码,而不是在循环内并行代码,以便为单个学习者并行不同的窗口方法。

单个迭代的执行在我的macbook上只有2个多小时,其中只有2个核心似乎正在做任何事情(其他两个核心只是空闲)。链接中的实际代码设置为20次迭代......使用我的空闲内核来减少这个

会很棒

1 个答案:

答案 0 :(得分:2)

在非并行的情况下,将函数传递到lapply循环很简单。

lapply(c(mean, sum), function(f) f(1:5))

使用R进行并行编程的几个不同系统。下一个示例使用snow

library(snow)
cl <- makeCluster(c("localhost","localhost"), type = "SOCK")
clusterApply(cl, c(mean, sum), function(f) f(1:5))
stopCluster(cl)

在每种情况下你应该得到相同的答案!