Base R 是单线程的,因此 4 核 CPU 上的使用率预计为 25%。在一台 Windows 机器上,可以使用以下任一方法将处理分散到集群(或核心,如果您愿意)parallel包和foreach包裹。
首先,并行包(R 2.8.0+中包含,无需安装)提供了基于snow包的功能——这些功能是lapply()
。 foreach 包提供了 for 循环结构的扩展 - 请注意,它必须与并行包裹。
下面是使用这两个包进行 k 均值聚类的快速示例。思路很简单,就是(1)拟合kmeans()
在每个集群中,(2) 结合结果和 (3) 选择最小值tot.withiness
.
library(parallel)
library(iterators)
library(foreach)
library(doParallel)
# parallel
split = detectCores()
eachStart = 25
cl = makeCluster(split)
init = clusterEvalQ(cl, { library(MASS); NULL })
results = parLapplyLB(cl
,rep(eachStart, split)
,function(nstart) kmeans(Boston, 4, nstart=nstart))
withinss = sapply(results, function(result) result$tot.withinss)
result = results[[which.min(withinss)]]
stopCluster(cl)
result$tot.withinss
#[1] 1814438
# foreach
split = detectCores()
eachStart = 25
# set up iterators
iters = iter(rep(eachStart, split))
# set up combine function
comb = function(res1, res2) {
if(res1$tot.withinss < res2$tot.withinss) res1 else res2
}
cl = makeCluster(split)
registerDoParallel(cl)
result = foreach(nstart=iters, .combine="comb", .packages="MASS") %dopar%
kmeans(Boston, 4, nstart=nstart)
stopCluster(cl)
result$tot.withinss
#[1] 1814438
这些包的更多详细信息和更多示例可以在以下帖子中找到。
- 单机并行处理Ⅰ http://jaehyeon-kim.github.io/2015/03/Parallel-Processing-on-Single-Machine-Part-I
- 单机并行处理二 http://jaehyeon-kim.github.io/2015/03/Parallel-Processing-on-Single-Machine-Part-II
- 单机并行处理Ⅲ http://jaehyeon-kim.github.io/2015/03/Parallel-Processing-on-Single-Machine-Part-III