2015-06-30 8 views
7

Nella mia tesi ho bisogno di eseguire molti studi di simulazione, che richiedono tutti un po 'di tempo. Il mio computer ha 4 core, quindi mi sono chiesto se è possibile eseguire ad esempio due script R in Rstudio allo stesso tempo, consentendo loro di utilizzare due core diversi? Se ciò potesse essere fatto, potrei risparmiare un sacco di tempo semplicemente lasciando il computer durante la notte eseguendo tutti questi script.Eseguire più R-script contemporaneamente

+0

Penso che ci sia una risposta a tale domanda [collegamento] (http://stackoverflow.com/questions/10835122/multithreading-with-r/10835234), o ci [collegamento] (http://stackoverflow.com/ domande/18377870/running-jobs-in-background-in-r) – Batanichek

+1

È possibile stabilire più sessioni R ed eseguire gli script uno per sessione. – Hav0k

risposta

7

Supponendo che i risultati non hanno bisogno di finire nello stesso ambiente, è possibile raggiungere questo obiettivo con progetti RStudio: https://support.rstudio.com/hc/en-us/articles/200526207-Using-Projects

Innanzitutto creare due progetti separati. È possibile aprire entrambi contemporaneamente, il che comporterà due ressioni. È quindi possibile aprire ciascuno script in ogni progetto ed eseguirne uno separatamente. È quindi sul tuo sistema operativo gestire l'allocazione core.

3

È possibile ottenere il parallelismo multicore (come spiegato qui https://cran.r-project.org/web/packages/doMC/vignettes/gettingstartedMC.pdf) nella stessa sessione con il seguente codice

if(Sys.info()["sysname"]=="Windows"){ 
    library(doParallel) 
    cl<-makeCluster(numberOfCores) 
    registerDoParallel(cl) 
}else{ 
    library(doMC) 
    registerDoMC(numberOfCores) 
} 
library(foreach) 

someList<-list("file1","file2") 
returnComputation <- 
    foreach(x=someList) %dopar%{ 
    source(x) 
    } 


if(Sys.info()["sysname"]=="Windows") stopCluster(cl) 

Sarà necessario comunque adattare il vostro output.

+0

sfortunatamente, questo non sembra essere supportato su Windows (secondo i documenti citati) – mrjoseph

4

Se fai clic con il tasto destro su RStudio, dovresti essere in grado di aprire diverse "sessioni" separate di RStudio (indipendentemente dal fatto che tu usi o meno Progetti). Di default questi useranno 1 core ciascuno. Tuttavia, se abbia diversi script che si sa eseguito senza errori, mi consiglia di correre questi su diversi parametri attraverso la riga di comando:

RCMD script.R 
RScript script.R 

in esecuzione in background:

nohup Rscript script.R & 

Qui "& "esegue lo script in background (può essere recuperato con fg, monitorato con htop e ucciso con kill <pid> o pkill rsession) e nohup salva l'output in un file e continua a essere eseguito se il terminale è chiuso.

Passaggio di argomenti a uno script:

Rscript script.R 1 2 3 

Ciò passerà c(1, 2, 3) di R come uscita del commandArgs() così un ciclo in bash può eseguire più istanze di rscript con un ciclo bash:

for ii in 1 2 3 
    do 
    nohup Rscript script.R $ii & 
    done 

Codice parallelo in esecuzione (all'interno di R):

Troverete spesso che un particolare passaggio nel vostro script R sta rallentando i calcoli, potrei suggerire eseguire il codice parallelo all'interno del codice R piuttosto che eseguirlo separatamente? Mi consiglia la snow package per l'esecuzione di loop in parallelo in R. In generale, invece di utilizzo:

cl <- makeCluster(n) 
# n = number of cores (I'd recommend one less than machine capacity) 
clusterExport(list=ls()) #export input data to all cores 
output_list <- parLapply(cl, input_list, function(x) ...) 
stopCluster() # close cluster when complete (particularly on shared machines) 

Utilizzare questo ovunque si usa normalmente una funzione lapply in R per eseguirlo in parallelo.