R并行处理并行处理

示例

基本软件包parallel允许通过派生,套接字和随机数生成进行并行计算。

检测本地主机上存在的核心数:

parallel::detectCores(all.tests = FALSE, logical = TRUE)

在本地主机上创建核心集群:

parallelCluster <- parallel::makeCluster(parallel::detectCores())

首先,必须创建适合并行化的功能。考虑mtcars数据集。回归上mpg可以通过创建一个单独的回归模型的每一级加以改进cyl。

data <- mtcars
yfactor <- 'cyl'
zlevels <- sort(unique(data[[yfactor]]))
datay <- data[,1]
dataz <- data[,2]
datax <- data[,3:11]


fitmodel <- function(zlevel, datax, datay, dataz) {
  glm.fit(x = datax[dataz == zlevel,], y = datay[dataz == zlevel])
}

创建一个可以遍历的所有可能迭代的函数zlevels。这仍然是串行的,但是是重要的一步,因为它确定了将要并行化的确切过程。

fitmodel <- function(zlevel, datax, datay, dataz) {
  glm.fit(x = datax[dataz == zlevel,], y = datay[dataz == zlevel])
}


for (zlevel in zlevels) {
  print("*****")
  print(zlevel)
  print(fitmodel(zlevel, datax, datay, dataz))
}

咖喱这个功能:

worker <- function(zlevel) {
    fitmodel(zlevel,datax, datay, dataz)
  }

使用的并行计算parallel无法访问全局环境。幸运的是,每个函数创建一个parallel可以访问的本地环境。包装函数的创建允许并行化。还需要将要应用的功能放在环境中。

wrapper <- function(datax, datay, dataz) {
  # force evaluation of all paramters not supplied by parallelization apply
  force(datax)
  force(datay)
  force(dataz)
  # these variables are now in an enviroment accessible by parallel function
  
  # function to be applied also in the environment
  fitmodel <- function(zlevel, datax, datay, dataz) {
    glm.fit(x = datax[dataz == zlevel,], y = datay[dataz == zlevel])
  }
  
  # calling in this environment iterating over single parameter zlevel
  worker <- function(zlevel) {
    fitmodel(zlevel,datax, datay, dataz)
  }
  return(worker) 
}

现在创建一个集群并运行包装函数。

parallelcluster <- parallel::makeCluster(parallel::detectCores())
models <- parallel::parLapply(parallelcluster,zlevels,
                              wrapper(datax, datay, dataz))

完成后,请始终停止集群。

parallel::stopCluster(parallelcluster)

该parallel软件包包括整个apply()家族,并以开头par。