2012-01-09 143 views
1

我正在努力研究如何将“数据挖掘与R - 学习案例研究”中的一些代码并行化,以便在我的Macbook Pro上运行得更快。问题中的特定代码如下。该代码基本上使用相同的数据(DS),并将6个不同的学习者(例如svm,nnet用于回归和分类等)和少量变体应用。R - 如何并行化蒙特卡洛模拟的for循环?

完整的代码是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

对于广泛的蒙特卡洛模拟,无论您如何平行化,R可能都太慢。获得小的(1-5倍)加速的简单方法是使用编译器函数来编译主函数(例如'variantsCMP < - cmpfun(variants)'),但是为了更快的加速,您可以最好地使用编译语言。通过'Rcpp'软件包可以很容易地在R中实现C++ – 2012-01-09 19:21:51

+2

并行计算的一种快速和肮脏的方法是使用'lapply(1:N,some_function)',其中'N'是你想要的次数来计算'some_function'在Unix/Linux上,你可以用'parallel'软件包中的'mclapply'来代替'lapply'(假设你有一个以上的内核)。如果你在Windows上,看看'snow 'package。 – 2012-01-09 20:13:15

+0

所以,像lapply(1:6,code_as_function())这样的函数?函数使用所有全局变量而不是传递给它的任何东西?这似乎是有道理的,因为TODO变量是只是一个更精简的名称列表适用于整个数据集 – 2012-01-09 20:25:44

回答

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) 

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

+0

我在mac上,所以像t此刻的加利福尼亚州 - 无雪 – 2012-01-09 21:58:23

+0

CRAN上有一个Mac二进制代码用于'snow'。你确定它不会起作用吗? http://cran.r-project.org/web/packages/snow/index.html – 2012-01-09 22:06:58

+0

无论如何,使用哪种并行方式并没有对概念产生影响:你需要像'lapply'这样的函数,并且通过它的功能列表(功能的名称也将起作用)。 – 2012-01-09 22:09:26