作者tony255034 (5245566)
看板R_Language
標題[問題] for 迴圈的平行運算
時間Wed Oct 21 19:51:34 2015
[問題類型]:
程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來)
[軟體熟悉度]:
新手(沒寫過程式,R 是我的第一次)
[問題敘述]:
目前有一個數學模型,每次要跑20秒,懲罰係數大約為16*16種組合
想利用版上所說的RMPI來優化程式,但我是用雙for迴圈來代入懲罰係數的
目前是想平行運算各組合,將各組合結果儲存到一個陣列,
再去找出最小的AIC
[程式範例]:
wn = seq(0.25,1,0.05)
wn1 = seq(0.25,1,0.05)
AIC0 = 10^6
for(i in 1:length(wn)){
for(j in 1:length(wn1)){
list[AIC,BIC] = Model(wn[i],wn1[j]);
if(AIC < AIC0){
finalAIC = AIC
finalBIC = BIC
}
}
}
[環境敘述]:
Win7 32bit R3.2.2
[關鍵字]:
Parallel Computing、RMPI
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.195.74.150
※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1445428297.A.5AF.html
另外想請教一下這個錯誤要怎麼解決?
Error in mpi.comm.spawn(slave = mpitask, slavearg = args,
nslaves = count, :
Other MPI error, error stack:
RMPI不知道為何在我的電腦會出現這個錯誤 所以我就改用parallel這個函式庫
library(parallel)
inputs <- 1:256
processInput <- function(i){
wn = seq(0.25,1,0.05)
wn1 = seq(0.25,1,0.05)
wnpair <- data.frame("wn0" = double(), "wn1" = double(),
stringsAsFactors=FALSE)
for(i in 1:length(wn)){
for(j in 1:length(wn1)){
wnpair[nrow(wnpair) + 1,] <- c(wn[i],wn1[j])
}
}
wnpair$wn0[i] * wnpair$wn1[i]
}
numCores <- detectCores()
c1 <- makeCluster(numCores)
results = parLapply(c1,inputs,processInput)
stopCluster(c1)
所得出的results變成256個0.25 而不是兩兩相乘 版上各位大大可以教學一下嗎?
→ Wush978: 沒有要跨電腦的話,就不須要用MPI 10/21 21:36
→ Wush978: 直接看看parallel或snow等套件吧 10/21 21:36
→ tony255034: 了解 parallel可以直接代入兩個參數嗎?? 10/21 21:39
→ Wush978: 應該不能吃兩個參數,但是你可以用expand.grid展開一個 10/21 21:42
→ Wush978: c(length(wn) * length(wn1), 2)的矩陣,裡面列出i,j的所 10/21 21:43
→ Wush978: 有組合 10/21 21:43
感謝 有試了expand.grid 但不知道代入function後要如何分別用兩個參數
library(parallel)
inputs <- 1:256
wn = seq(0.25,1,0.05)
wn1 = seq(0.3,1,0.05)
processInput <- function(i) {
i$Var1 + i$Var2
}
inputs <- expand.grid(wn,wn1)
numCores <- detectCores()
# results = mclapply(inputs, processInput, mc.cores = numCores)
# the above won't work on Windows, but this will:
cl <- makeCluster(numCores)
results = parLapply(cl, inputs, processInput)
stopCluster(cl)
會得到錯誤
Error in checkForRemoteErrors(val) :
2 nodes produced errors; first error: $ operator is invalid for atomic
vectors
※ 編輯: tony255034 (123.195.74.150), 10/21/2015 22:28:29
→ Wush978: 只丟一維的變數到第一個參數,在函數裡面用expand.grid 10/22 00:58
→ Wush978: 的結果再展開成二維 10/22 00:58