Base R è a thread singolo in modo che il 25% di utilizzo sia previsto sulla CPU a 4 core. Su un singolo computer Windows, è possibile distribuire l'elaborazione tra cluster (o core, se lo si desidera) utilizzando il pacchetto parallelo parallelo e il pacchetto foreach.
Prima di tutto, il pacchetto parallelo (incluso in R 2.8.0+, nessuna necessità di installazione) fornisce funzioni basate sul pacchetto neve - queste funzioni sono estensioni di lapply()
. E il pacchetto foreach fornisce un'estensione del costrutto for-loop - si noti che deve essere usato con il pacchetto doParallel.
Di seguito è riportato un breve esempio di cluster k-means che utilizza entrambi i pacchetti. L'idea è semplice, ovvero (1) il montaggio di kmeans()
in ciascun cluster, (2) la combinazione dei risultati e (3) il minimo di selezione 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
Ulteriori dettagli di questi pacchetti e altri esempi sono disponibili nei seguenti post.
fonte
2015-05-02 06:04:26
Avete 4 core? Controlla la scheda "prestazioni", è 1 core al 100%? – RaGe
Quali sono le specifiche del tuo computer? Quale versione di R stai usando? –