2017-07-28 35 views
5

我已經在這個主題上看到了其他一些帖子,但沒有一個與我遇到的問題完全一樣。但這裏有雲:

我使用

cores <- detectCores() cl <- makeCluster(8L,outfile="output.txt") registerDoParallel(cl) x <- foreach(i = 1:length(y), .combine='list',.packages=c('httr','jsonlite'), .multicombine=TRUE,.verbose=F,.inorder=F) %dopar% {function(y[i])}

這往往能正常工作,但現在引發錯誤並聯運行功能:

Error in serialize(data, node$con) : error writing to connection

在輸出的檢查.txt文件我看到:

starting worker pid=11112 on localhost:11828 at 12:38:32.867 
starting worker pid=10468 on localhost:11828 at 12:38:33.389 
starting worker pid=4996 on localhost:11828 at 12:38:33.912 
starting worker pid=3300 on localhost:11828 at 12:38:34.422 
starting worker pid=10808 on localhost:11828 at 12:38:34.937 
starting worker pid=5840 on localhost:11828 at 12:38:35.435 
starting worker pid=8764 on localhost:11828 at 12:38:35.940 
starting worker pid=7384 on localhost:11828 at 12:38:36.448 
Error in unserialize(node$con) : embedded nul in string: '\0\0\0\006SYMBOL\0\004\0\t\0\0\0\003')'\0\004\0\t\0\0\0\004expr\0\004\0\t\0\0\0\004expr\0\004\0\t\0\0\0\003','\0\004\0\t\0\0\0\024SYMBOL_FUN' 
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode - 
unserialize 
Execution halted 

這個錯誤我間歇性的。內存很豐富(32GB),內存中沒有其他大的R對象。並行代碼中的函數從雲中檢索一些小的json數據對象,並將它們放入R對象 - 因此沒有大數據文件。我不知道爲什麼它偶爾會看到一個嵌入的nul並停下來。

我有一個類似的問題,從一個函數,也從雲中的csv文件。直到現在,這兩個函數都能在R 3.3.0和R 3.4.0下正常工作。

我在Windows上使用R 3.4.1和RStudio 1.0.143。

這裏是我的sessionInfo

sessionInfo() 
R version 3.4.1 (2017-06-30) 
Platform: x86_64-w64-mingw32/x64 (64-bit) 
Running under: Windows 7 x64 (build 7601) Service Pack 1 

Matrix products: default 

locale: 
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United 
States.1252 LC_MONETARY=English_United States.1252 
[4] LC_NUMERIC=C       LC_TIME=English_United States.1252  

attached base packages: 
[1] parallel stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] RJSONIO_1.3-0  RcppBDT_0.2.3  zoo_1.8-0   data.table_1.10.4 
doParallel_1.0.10 iterators_1.0.8 
[7] RQuantLib_0.4.2 foreach_1.4.3  httr_1.2.1  

loaded via a namespace (and not attached): 
[1] Rcpp_0.12.12  lattice_0.20-35 codetools_0.2-15 grid_3.4.1  
R6_2.2.2   jsonlite_1.5  tools_3.4.1  
[8] compiler_3.4.1 

UPDATE

現在我得到另一個類似的錯誤:

Error in unserialize(node$con) : ReadItem: unknown type 100, perhaps written by later version of R

嵌入式NUL錯誤似乎已經消失。我也嘗試刪除.Rhistory和.Rdata,並刪除我的包子文件夾並重新加載所有的包。至少這個新的錯誤似乎一致。我找不到「未知類型100」。

+0

也許您的環境中有大型對象在羣集上導出?嘗試將這個foreach調用放在它自己的函數中。 –

+0

這似乎不是問題 - 我實際上刪除了環境中的所有無關對象。 – user2642948

+0

你可以用你可以給我們的'function'來重現問題嗎? –

回答

4

我得到一個類似的錯誤...通常發生在隨後的腳本運行時,當我以前的某個腳本出錯時,或者我提前將其停止。這可能是你提到的部分:「我不知道爲什麼它偶爾會看到一個嵌入的nul並停止」,這可能是錯誤。

這有一些很好的信息,特別是要確保爲常規Windows進程運行留下1個核心。還提到「如果你從這些功能中任何一個出現錯誤,通常意味着至少有一名工作人員死亡」,這可能支持我關於錯誤後崩潰的理論。

doParallel error in R: Error in serialize(data, node$con) : error writing to connection

到目前爲止,我的解決方案已經通過再次運行此重新初始化並行後端:

registerDoParallel(cl) 

它通常工作以後,但我注意到,之前的多核心課程在我的任務管理器中不要走開,即使有:

stopCluster(cl) 

這就是爲什麼我有時會重啓R.

+0

是的,我也有核心問題甚至沒有停止,甚至在'stopCluster(cl)'之後。我會嘗試重新初始化後端。我試圖在普通的Windows進程中將內核數量減少1,但這似乎沒有幫助。 – user2642948

+0

我只是再次嘗試了代碼並且它運行了 - 但這是最​​近15次嘗試中的第一次。輸出文件這次沒有指出任何錯誤。但幾乎沒有一個信心建設者..... – user2642948

+1

另外三次嘗試導致失敗。重新啓動R,減少內核,並重新初始化並行後端不會有幫助。 – user2642948

2

我還注意到多核會話不會離開任務管理器。

從使用中切換:stopCluster(cl)stopImplicitCluster() 爲我工作。從我的閱讀,這是應該用「一條線」 registerDoParallel(cores=x) VS

cl<-makeCluster(x) 
registerDoParallel(cl) 

我的「直覺」時使用的是Windows如何處理集羣需要stopImplicitCluster,但你的經驗可能會有所不同。

我會評論,但這是(提示帶)我的第一個STACKOVERFLOW POST!