[問題] boot() 函式的平行運算

作者: roussas (盡力了..)   2014-09-12 14:27:51
[問題類型]:
效能諮詢(我想讓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%在運作。
[關鍵字]:
選擇性,也許未來有用
作者: andrew43 (討厭有好心推文後刪文者)   2014-09-14 19:18:00
help(files) 耍笨了 sorry推錯 sorry

Links booklink

Contact Us: admin [ a t ] ucptt.com