我正在努力研究如何将“数据挖掘与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次迭代......使用我的空闲内核来减少这种情况会很棒
对于广泛的蒙特卡洛模拟,无论您如何平行化,R可能都太慢。获得小的(1-5倍)加速的简单方法是使用编译器函数来编译主函数(例如'variantsCMP < - cmpfun(variants)'),但是为了更快的加速,您可以最好地使用编译语言。通过'Rcpp'软件包可以很容易地在R中实现C++ – 2012-01-09 19:21:51
并行计算的一种快速和肮脏的方法是使用'lapply(1:N,some_function)',其中'N'是你想要的次数来计算'some_function'在Unix/Linux上,你可以用'parallel'软件包中的'mclapply'来代替'lapply'(假设你有一个以上的内核)。如果你在Windows上,看看'snow 'package。 – 2012-01-09 20:13:15
所以,像lapply(1:6,code_as_function())这样的函数?函数使用所有全局变量而不是传递给它的任何东西?这似乎是有道理的,因为TODO变量是只是一个更精简的名称列表适用于整个数据集 – 2012-01-09 20:25:44