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。