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 &lt;- 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 &lt;- list(A = ..., B = ...); return(res$A)。或者,定义您自己的 .combine 函数来做同样的事情。 (不过,第一个选项会导致更少的数据移动;如果 res$B 很大,这很重要!)

以上是关于R中的并行处理的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在这个 R 代码中进行并行处理?

r R并行处理分组data.table的fork处理

R中的并行优化

R 等效于 python 的 os.getpid() 用于并行处理

并行处理中的最佳内核数是多少?

如何在R中返回并行处理的表列表