我想加快我的引导功能,它本身工作得很好。我读到自 R 2.14 以来有一个名为 的包parallel
,但我发现它对某人来说非常困难。计算机科学知识很少,无法真正实现它。也许有人可以帮忙。
所以这里我们有一个引导程序:
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=" "))
}
目标是使用并行处理/利用我 PC 的多个内核。我在 Windows 下运行 R。谢谢!
编辑(诺亚回复后)
以下语法可用于测试:
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)
但是,在我的机器上,简单的 R 代码更快。这是并行处理的已知副作用之一,即它会导致分叉进程的开销,这会增加像这样的“简单任务”中的时间?
编辑:在我的机器上,parallel
代码比“简单”代码长约 5 倍。boot
当我增加任务的复杂性(例如增加或n
)时,这个因素显然不会改变。所以也许代码或我的机器有问题(基于 Windows 的处理?)。