2016-02-18 54 views
3

基於this post here mclapply,我試着寫一個腳本,在這裏看到:半徑誤差在foreach循環

library(parallel) 
library(doParallel) 

cl<-makeCluster(2,outfile='') 
registerDoParallel(cl) 

foreach(i=1:5, .packages='parallel') %dopar% { 
    system.time(mclapply(1:10, function(x){rnorm(1e5)},mc.cores=2)) 
} 

stopCluster(cl) 

它的工作intially但現在扔了錯誤代碼:

Error in unserialize(node$con) : error reading from connection 
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize 
Execution halted 
Error in unserialize(socklist[[n]]) : error reading from connection 
Error in unserialize(node$con) : error reading from connection 
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize 
Execution halted 

任何想法發生了什麼?甚至可以把mclapply放在foreach循環中嗎?

編輯:我也想說這是在一個8核心機器上,而不是一個羣集。

回答

4

我能夠重現你的問題只用「水貨」包我的Linux機器上的R中3.2.3:

library(parallel) 
cl <- makeCluster(2) 
clusterEvalQ(cl, library(parallel)) 
fun <- function(i) { 
    mclapply(1:10, function(x) rnorm(1e5), mc.cores=2) 
    0 
} 
clusterApplyLB(cl, 1:5, fun) 

從我的調試會話,看來高手之間的套接字連接並工作人員可能會受到損壞,這可能會導致工作人員在嘗試從受損套接字連接「反序列化」數據時出現錯誤。

有趣的是,我可以通過使用「多核」包而不是「並行」來得到這個例子。

> install.packages('multicore',,'http://www.rforge.net/') 

然後,我裝上了工人「多核」,而不是「水貨」:

clusterEvalQ(cl, library(multicore)) 

然後代碼工作正常使用我的命令安裝了RForge.net多核0.1-8。你可以改變你的foreach循環來使用.packages='multicore'選項。

這就像我追蹤它。我的猜測是,在「並行」中由「mclapply」分支的子進程會以某種方式破壞它們繼承的套接字連接,但我沒有看過代碼以查看該理論是否合理。

我猜你的選擇是:

  1. 不要在 「doParallel」 foreach循環
  2. 使用 「mclapply」 使用 「mclapply」 從 「多核0.1-8」,而不是 「水貨」
  3. 將此問題報告給R-核心

你必須做額外的工作,將此情況報告給R-核心,但我希望我的例子會有所幫助。

+0

這似乎是工作!非常感謝! – Plinth