R中的并行处理
Posted
技术标签:
【中文标题】R中的并行处理【英文标题】:Parallel processing in R 【发布时间】:2013-01-27 08:26:22 【问题描述】:我正在使用自定义随机森林函数,该函数需要一组基因组数据(大约 56k 列)中的起点和终点。
我想将列号拆分为子组,并允许单独处理每个子组以加快处理速度。我用以下代码尝试了这个(不成功):
library(foreach)
library(doMC)
foreach(startMrk=(markers$start), endMrk=(markers$end)) %dopar%
rfFunction(genoA,genoB,0.8,ntree=100,startMrk=startMrk,endMrk=endMrk)
其中 startMrk 是数值变量数组:1 4 8 12 16
,endMrk 是另一个数组:3 7 11 15 19
对于这个例子,我希望一个核心以 1:3 运行样本,另一个以 4:7 运行,等等。我对 R 中的并行处理概念不熟悉,所以我非常愿意研究任何可用的文件。有人对我在并行处理或上述代码中缺少的东西有什么建议吗?
【问题讨论】:
【参考方案1】:这里的基本点是您将列拆分为块,对。首先,最好在每次迭代时适当地对数据集进行分块并将这些块馈送到 RF 中。此外,foreach 在某些方面的工作方式与 for 类似,因此代码可以
rfs=vector('list',4)
foreach(i=1:4) %dopar%
ind <- markers$start[i]:markers$end[i]
rfs[[i]] <- randomForest(genoA[,ind],genoB[,ind], 0.8, ntree=100)
我在常规 randomForest 中给出了这个,但您可以直接将其封装到您的自定义代码中。
【讨论】:
这并不完全正确,但是当我使用类似的东西时:r <- foreach(i=1:5, .combine="cbind") %dopar% RandomForest(genoA,genoB,0.8,ntree=100,startMrk=markers$start[i],endMrk=markers$end[i])
我得到了我想要的东西。最后一个问题:我正在使用的自定义函数返回一个列表。有没有办法选择性地组合列表中的元素?感谢您的帮助!
有点晚了,但要回答您的“最后一个问题”:与其“选择性地组合列表中的元素”,不如直接提取您感兴趣的列表元素?而不是:foreach(...) %dopar% return(list(A = ..., B = ...))
;试试:foreach(...) %dopar% res <- list(A = ..., B = ...); return(res$A)
。或者,定义您自己的 .combine
函数来做同样的事情。 (不过,第一个选项会导致更少的数据移动;如果 res$B
很大,这很重要!)以上是关于R中的并行处理的主要内容,如果未能解决你的问题,请参考以下文章