База R однопоточная, поэтому ожидается, что на 4-ядерном процессоре ожидается 25% использования. На одной машине Windows можно распространять обработку по кластерам (или ядрам, если хотите), используя либо пакет , либо пакет, и пакет foreach.
Прежде всего, параллельный пакет (входит в R 2.8.0+, не требует установки) предоставляет функции, основанные на пакете снега - эти функции являются расширениями 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
Более подробную информацию об этих упаковках и другие примеры можно найти в следующих статьях.
У вас есть 4 ядра? Проверьте вкладку «производительность», 1 ядро на 100%? – RaGe
Каковы спецификации вашего компьютера? Какую версию R вы используете? –