Как я могу заставить 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% загрузки процессора.