Vorrei accelerare la mia funzione di bootstrap, che funziona perfettamente bene. Ho letto che dal momento che R 2.14 c'è un pacchetto chiamato parallel
, ma lo trovo molto difficile per sb. con scarsa conoscenza dell'informatica per implementarla davvero. Forse qualcuno può aiutare.Utilizzo di R parallelo per accelerare il bootstrap
Quindi qui abbiamo un bootstrap:
n<-1000
boot<-1000
x<-rnorm(n,0,1)
y<-rnorm(n,1+2*x,2)
data<-data.frame(x,y)
boot_b<-numeric()
for(i in 1:boot){
bootstrap_data<-data[sample(nrow(data),nrow(data),replace=T),]
boot_b[i]<-lm(y~x,bootstrap_data)$coef[2]
print(paste('Run',i,sep=" "))
}
L'obiettivo è quello di utilizzare l'elaborazione parallela/sfruttare i core multipli del mio PC. Sto usando R sotto Windows. Grazie!
EDIT (dopo la risposta da Noah)
la seguente sintassi può essere utilizzato per il test:
library(foreach)
library(parallel)
library(doParallel)
registerDoParallel(cores=detectCores(all.tests=TRUE))
n<-1000
boot<-1000
x<-rnorm(n,0,1)
y<-rnorm(n,1+2*x,2)
data<-data.frame(x,y)
start1<-Sys.time()
boot_b <- foreach(i=1:boot, .combine=c) %dopar% {
bootstrap_data<-data[sample(nrow(data),nrow(data),replace=T),]
unname(lm(y~x,bootstrap_data)$coef[2])
}
end1<-Sys.time()
boot_b<-numeric()
start2<-Sys.time()
for(i in 1:boot){
bootstrap_data<-data[sample(nrow(data),nrow(data),replace=T),]
boot_b[i]<-lm(y~x,bootstrap_data)$coef[2]
}
end2<-Sys.time()
start1-end1
start2-end2
as.numeric(start1-end1)/as.numeric(start2-end2)
Tuttavia, sulla mia macchina il codice R semplice è veloce. Si tratta di uno degli effetti collaterali noti dell'elaborazione parallela, vale a dire che i costi generali impongono il processo che si aggiunge al tempo in "compiti semplici" come questo?
Modifica: sulla mia macchina il codice parallel
richiede circa 5 volte di più del codice 'semplice'. Apparentemente questo fattore non cambia in quanto aumento la complessità dell'attività (ad esempio, aumento boot
o n
). Quindi forse c'è un problema con il codice o la mia macchina (elaborazione basata su Windows?).
Grazie, ho riassunto la sintassi suggerita per il test (codice modificato sopra). Ora usa il 100% della mia CPU (cioè tutti i processori). Tuttavia, questo è più lento rispetto a farlo senza elaborazione parallela, vedi sopra. – tomka
Sarebbe bello se tu potessi dare qualche suggerimento addizionale sul problema del tempo, cioè perché il tuo suggerimento non lo sta accelerando? Grazie. – tomka
Hmm. Interessante.Sulla mia macchina, (8 core HT, 8 GB ram, Ubuntu 12.04), ho ottenuto un aumento della velocità di circa 3.4X con poca RAM. Non ho familiarità con il multithreading in un ambiente Windows. Ecco alcune cose da provare: – Noah