Chciałbym przyśpieszyć moją funkcję bootstrap, która działa idealnie idealnie. Przeczytałem, że od R 2.14 jest pakiet o nazwie parallel
, ale dla mnie jest to bardzo trudne. z niską znajomością informatyki, aby naprawdę ją wdrożyć. Może ktoś może pomóc.Używanie R równolegle do przyspieszenia bootstrap
Więc tutaj mamy 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=" "))
}
Celem jest użycie przetwarzania równoległego/wykorzystać wiele rdzeni mojego komputera. Używam R pod Windows. Dzięki!
EDIT (po post przez Noego)
Poniższa składnia może być używany do testowania:
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)
Jednak na moim komputerze prosty kod R jest szybsze. Czy jest to jeden ze znanych efektów ubocznych przetwarzania równoległego, tj. Powoduje, że koszty ogólne są rozwidleniem procesu, który zwiększa czas w "prostych zadaniach", takich jak ten?
Edytuj: Na moim komputerze kod parallel
trwa około 5 razy dłużej niż kod "prosty". Ten czynnik najwyraźniej się nie zmienia, ponieważ zwiększam złożoność zadania (np. Zwiększam boot
lub n
). Więc może jest problem z kodem lub moim komputerem (przetwarzanie w systemie Windows?).
Dzięki, zsumowałem sugerowaną składnię do testowania (edytowany kod powyżej). Teraz używa 100% mojego procesora (tj. Wszystkich procesorów). Jest to jednak wolniejsze niż robienie tego bez przetwarzania równoległego, patrz wyżej. – tomka
Byłoby świetnie, gdybyś mógł podać dodatkowe sugestie dotyczące problemu związanego z czasem, czyli dlaczego Twoja sugestia nie przyspiesza? Dzięki. – tomka
Hmm. Ciekawy.Na moim komputerze (8 rdzeni HT, 8 GB pamięci RAM, Ubuntu 12.04) uzyskałem przyspieszenie około 3,4X przy małym wykorzystaniu pamięci RAM. Nie jestem zaznajomiony z wielowątkowością w środowisku Windows. Oto kilka rzeczy do wypróbowania: – Noah