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

看板R_Language作者 (盡力了..)時間9年前 (2014/09/12 14:27), 9年前編輯推噓0(002)
留言2則, 1人參與, 最新討論串1/1
[問題類型]: 效能諮詢(我想讓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%在運作。 [關鍵字]: 選擇性,也許未來有用 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.113.114.60 ※ 文章網址: http://www.ptt.cc/bbs/R_Language/M.1410503274.A.A7C.html ※ 編輯: roussas (140.113.114.60), 09/12/2014 14:28:23 ※ 編輯: roussas (140.113.114.60), 09/12/2014 14:29:06

09/14 19:18, , 1F
help(files) 耍笨了 sorry
09/14 19:18, 1F

09/14 19:18, , 2F
推錯 sorry
09/14 19:18, 2F
文章代碼(AID): #1K4f9gfy (R_Language)