将 R Parallel 与其他 R 包一起使用

Jes*_*som 5 parallel-processing multicore r

我正在使用 R 中的 LQMM 包进行非常耗时的分析。我将模型设置为从星期四开始运行,现在是星期一,并且仍在运行。我对模型本身充满信心(作为标准 MLM 进行测试),并且对我的 LQMM 代码充满信心(已经使用相同的数据集运行了其他几个非常相似的 LQMM,并且它们都花费了一天的时间来运行)。但我真的很想弄清楚如何使用我可以访问的机器的并行处理功能(注意所有机器都是基于 Microsoft Windows 的),如果可能的话,使其运行得更快。

我已经阅读了几篇关于使用并行的教程,但我还没有找到一个展示如何将并行包与其他 R 包配合使用的教程......我是否想太多了,或者这是不可能的?

这是我使用 R 包 LQMM 运行的代码:

install.packages("lqmm")
library(lqmm)
g1.lqmm<-lqmm(y~x+IEP+pm+sd+IEPZ+IEP*x+IEP*pm+IEP*sd+IEP*IEPZ+x*pm+x*sd+x*IEPZ,random=~1+x+IEP+pm+sd+IEPZ, group=peers, tau=c(.1,.2,.3,.4,.5,.6,.7,.8,.9),na.action=na.omit,data=g1data)
Run Code Online (Sandbox Code Playgroud)

该数据集有 58 个变量的 122433 个观测值。所有变量均经过 z 评分或虚拟编码。

Jel*_*eir 2

需要在所有节点上评估依赖库。为此目的,在包clusterEvalQ内预见了该功能。parallel您可能还需要将一些数据导出到子节点的全局环境:为此,您可以使用该clusterExport函数。另请查看此页面,了解可能对您有用的其他相关功能的更多信息。

一般来说,要通过使用多个核心来加速应用程序,您必须将问题分解为多个子部分,这些子部分可以在不同的核心上并行处理。要在 R 中实现此目的,您首先需要创建一个集群并为其分配特定数量的核心。接下来,您必须注册集群,将所需的变量导出到节点,然后评估每个子节点上的必要库。设置集群和启动节点的确切方式将取决于您将使用的子库和函数的类型。例如,当您选择使用该doParallel包(以及大多数其他并行化子库/函数)时,您的集群设置可能如下所示:

library(doParallel)
nrCores <- detectCores()
cl <- makeCluster(nrCores)
registerDoParallel(cl); 
clusterExport(cl,c("g1data"),envir=environment());
clusterEvalQ(cl,library("lqmm"))
Run Code Online (Sandbox Code Playgroud)

集群现已准备就绪。您现在可以将全局任务的子部分分配给集群中的每个单独节点。在下面的一般示例中,集群中的每个节点都将处理i全局任务的子部分。在示例中,我们将使用包foreach %dopar%提供的功能doParallel

doParallel 包使用 R 2.14.0 及更高版本的并行包为 foreach/%dopar% 函数提供并行后端。

子结果将自动添加到resultList. 最后,当所有子流程完成后,我们合并结果:

resultList <- foreach(i = 1:nrCores) %dopar%
{
   #process part i of your data.
}
stopCluster(cl)
#merge data..
Run Code Online (Sandbox Code Playgroud)

由于您的问题并不是专门关于如何拆分数据,因此我将让您自己弄清楚这部分的详细信息。doParallel不过,您可以在我对这篇文章的回答中找到使用该包的更详细示例。