Как я могу заставить R использовать больше процессора и памяти?

Независимо от того, насколько интенсивным является вычисление R, оно не использует более 25% ЦП. Я попытался установить приоритет rsession.exe в High и даже Realtime но использование остается тем же. Есть ли способ увеличить загрузку процессора R, чтобы полностью использовать потенциал моей системы, или есть какое-то недопонимание в моем понимании проблемы? Заранее спасибо за помощь.

PS: ниже приведен скриншот использования процессора.Скриншот использования процессора

2 ответа

Base R является однопоточным, поэтому ожидается 25% использования на 4-ядерном процессоре. На одном компьютере с Windows можно распределить обработку по кластерам (или ядрам, если хотите), используя параллельный пакет и пакет foreach.

Прежде всего, параллельный пакет (входит в R 2.8.0+, не требует установки) предоставляет функции на основе пакета snow - эти функции являются расширениями lapply(), А пакет foreach предоставляет расширение конструкции for-loop - обратите внимание, что он должен использоваться с пакетом doParallel.

Ниже приведен краткий пример кластеризации 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

Более подробную информацию об этих пакетах и ​​дополнительные примеры можно найти в следующих постах.

R в большинстве случаев однопоточный. Если вы не настроите его правильно, вы будете использовать только 1 ядро ​​на 100%. Я предполагаю, что вы используете четырехъядерный компьютер, так что 1 ядро ​​на 100% будет выглядеть как 25% загрузки процессора.

Другие вопросы по тегам