无论R计算的密集程度如何,它都不会占用超过25%的CPU。我已尝试将rsession.exe
的优先级设置为High
甚至Realtime
,但使用情况保持不变。有没有办法增加R的CPU使用率以充分利用我的系统的潜力,或者我对这个问题的理解是否有任何误解?在此先感谢您的帮助。
P.S。:下面是CPU使用情况的屏幕截图。
答案 0 :(得分:14)
Base R是单线程的,因此预计4核CPU的使用率为25%。在单台Windows计算机上,可以使用并行包和 foreach 包在群集(或核心,如果您喜欢)之间传播处理。
首先,并行软件包(包含在R 2.8.0+中,无需安装)提供基于snow软件包的功能 - 这些功能是lapply()
的扩展。 foreach包提供了for循环结构的扩展 - 请注意它必须与 doParallel 包一起使用。
下面是使用这两个包进行k-means聚类的快速示例。这个想法很简单,这是(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
可以在以下帖子中找到这些包的更多详细信息和更多示例。
答案 1 :(得分:1)