[问题类型]:
效能咨询(我想让R 跑更快)
[软件熟悉度]:
使用者(已经有用R 做过不少作品)
[问题叙述]:
目前尝试利用 bootstrap 的技巧计算统计量,利用 boot 套件中的 boot()
这个函式做 bootstrap 。
boot()函式有一个参数是 parallel,我在windows 的电脑上将它设定成
parallel="snow"后,发现它做1000次bootstrap的时间和我自己写的 for 循环几乎一样,
我预期它应该要有改进一点才是。
想问一下以下第二和第三种写法为什么没有作用?
[程式范例]:
library(boot)
library(snow)
library(doParallel)
#library(Rmpi) #我的电脑上这个套件无法安装,说我遗失了某个档案
我的 OrgData 是一个100x80的矩阵, f.boot 是我自己定义的函数,
f.boot<- function(x, ii){v<- x[ii,]; E<- eigen(cov(v)); sum(E$val) }
system.time(
#我没有设定 cl
b<- boot(OrgData, f.boot, R=1000, parallel="snow")
)[3]
system.time(
#设定 cl
b<- boot(OrgData, f.boot, R=1000, parallel="snow", cl=3)
)[3]
Q<- b$t
#
cl<- makeCluster(3, type="SOCK")
registerDoParallel(cl)
system.time(
b<- boot(OrgData, f.boot, R=1000, parallel="snow", cl=cl)
)[3]
Q<- b$t
#用 foreach()%dopar%{}
cores<- makeCluster(3)
registerDoParallel(cores)
clusterExport(cores, list("OrgData"), envir=.GlobalEnv)
system.time(
Q<- foreach(b=1:1000 )%dopar%{
ii<- sample(1:100, 100, replace=T)
f.boot(OrgData, ii)
}
)[3]
stopCluster(cl)
以上四个方法分别用掉
elapsed 5.05, 3.28, 3.29, 2.61
单纯写 for 循环
Q<- numeric()
system.time(
for(b in 1:1000 ){
ii<- sample(1:100, 100, replace=T)
Q[b]<- f.boot(OrgData, ii)
}
)[3]
elapsed
3.32
结果是第一种写法效能最差,第二种、第三种和纯用 for 循环差不多,用 foreach()的
最好。
我有开工作管理员,只有 foreach 在执行时CPU有用到75%(全部四核心),其他都只有
25%在运作。
[关键字]:
选择性,也许未来有用