R语言 使用 “parallel “进行并行处理
并行处理允许你的应用程序在更短的时间内完成更多的任务。这些有助于解决重大问题。在这篇文章中,我们将看看如何使用R编程语言中的 并行 库进行并行处理。
使用并行库
并行是一个基础包,包含在R 2.14.0中。它扩展了CRAN包multicore和snow的工作,并为这些包的大部分功能提供了落地的替代。
你可以使用下面的命令导入该库。
library(parallel)
你也可以用这个库来检查你系统中的核心数量。下面的代码也是这样做的。
library(parallel)
detectCores()
输出
8
平行化的方法
代码的并行化主要有两种方式:一是使用套接字,二是通过分叉。
使用parLapply()的套接字
这种并行处理方式比较慢,也比较难用。我们将使用的标准程序如下。
- 启动一个n个节点的集群。
- 在每个节点上运行任何必要的预处理代码。
- 用parapply来代替apply。
- 销毁该集群。
让我们通过一个例子来更好地理解这一点。出于演示的目的,我将找到数字1到5的正方形和立方体。
下面的代码可以完成这个工作。
lapply(1:5, function(x) median(rnorm(x*100)))
输出
如果我们将测量运行这个的时间,我们将得到。
time_taken <- system.time(
lapply(1:5, function(x) c(x^2,x^3))
)
time_taken
输出
现在让我们以并行的方式完成同样的任务。下面的代码利用并行库来执行同样的操作。
library(parallel)
no_cores <- detectCores()
# Creating a cluster with the number of cores
clust <- makeCluster(no_cores)
# Using parLapply instead of lapply
parLapply(clust,
1:5, function(x) median(rnorm(x*100)))
输出
如果我们现在测量它的执行时间,我们将得到。
library(parallel)
no_cores <- detectCores()
clust <- makeCluster(no_cores)
time_taken <- system.time(
parLapply(clust,1:5, function(x) median(rnorm(x*100)))
)
time_taken
输出
正如你所注意到的,第二种方法比第一种方法花费的时间更少。
用mclapply分叉
在这个方法中,我将利用mclapply()方法。我们将通过与上一节相同的例子,但是,在这里我们将使用mclapply()方法而不是lapply()方法。
library(parallel)
mclapply(1:5, function(x) median(rnorm(x*100)))
输出
如果我们现在要测量执行时间,我们会得到。
library(parallel)
time_taken <- system.time(
mclapply(1:5, function(x) median(rnorm(x*100)))
)
time_taken
输出