2015-05-02 11 views
9

Indipendentemente dall'intensità del calcolo R, non utilizza più del 25% della CPU. Ho provato a impostare la priorità dello rsession.exe su High e anche su Realtime ma l'utilizzo rimane lo stesso. C'è un modo per aumentare l'utilizzo della CPU di R per sfruttare tutto il potenziale del mio sistema o c'è qualche incomprensione nella mia comprensione del problema? Grazie in anticipo per l'aiuto.Come posso far sì che R usi più CPU e memoria?

P.S .: Di seguito è riportato uno screenshot dell'utilizzo della CPU. Screenshot of the CPU usage

+0

Avete 4 core? Controlla la scheda "prestazioni", è 1 core al 100%? – RaGe

+0

Quali sono le specifiche del tuo computer? Quale versione di R stai usando? –

risposta

1

R è, nella maggior parte dei casi, a singola filettatura. A meno che non lo imposti correttamente, userai solo 1 core al 100%. La mia ipotesi è che tu stia utilizzando una macchina quad-core in modo che 1 core al 100% assomigli al 25% di utilizzo della CPU.

+0

Grazie per la risposta. Ma come posso configurarlo per utilizzare tutti i core? Uso la macchina Intel 2nd Gen i5 2440M. Devo apportare modifiche al programma o configurare R in qualche modo? – Suraj

12

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.

+0

Grazie per la risposta. Quindi i cambiamenti devono essere introdotti nel programma invece della configurazione R? C'è un modo in cui R può essere configurato per utilizzare tutti i core? – Suraj

+0

'detectCores()' nel pacchetto parallelo identifica # cluster disponibili su una macchina. L'esempio sopra è fatto su laptop a 4 core e il suo equivalente a thread singolo è 'kmeans (Boston, 4, nstart = 100)'. Invece di eseguire l'algoritmo 100 volte in sequenza, la versione parallela viene eseguita 25 volte in ciascun cluster. Quindi i risultati sono combinati. | Per quanto ho cercato, il codice deve essere modificato se viene utilizzata la R distribuita da CRAN. Puoi effettuare una ricerca su Revolution Analytics ma non ne sono sicuro. –

+0

I collegamenti sono morti! – Faridcher

Problemi correlati