如何让R使用更多的CPU和内存?

时间:2015-05-02 05:16:42

标签: r cpu-usage

无论R计算的密集程度如何,它都不会占用超过25%的CPU。我已尝试将rsession.exe的优先级设置为High甚至Realtime,但使用情况保持不变。有没有办法增加R的CPU使用率以充分利用我的系统的潜力,或者我对这个问题的理解是否有任何误解?在此先感谢您的帮助。

P.S。:下面是CPU使用情况的屏幕截图。 Screenshot of the CPU usage

2 个答案:

答案 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)

在大多数情况下,R是单线程的。除非你正确设置,否则你将只使用1核心到100%。我的猜测是你使用的是四核机器,因此100%的1核心看起来会占用25%的CPU。

相关问题