2017-07-28 43 views
5

Widziałem kilka innych postów na ten temat, a żaden nie wydawał się być taki sam jak problem, który mam . Ale tu idzie:

biegnę funkcję równolegle używając

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])}

To często działa dobrze, ale teraz jest rzucanie błąd:

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

Po zbadaniu wyjściu .txt Plik widzę:

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 

Ten błąd są przerywane. Pamięć jest bogata (32 GB), a żadne inne duże obiekty R nie znajdują się w pamięci. Funkcja w kodzie równoległym pobiera pewną liczbę małych obiektów danych json z chmury i umieszcza je w obiekcie R - więc nie ma dużych plików danych. Nie wiem, dlaczego od czasu do czasu widzi wbudowany nul i przestaje.

Mam podobny problem z funkcją, która ściąga pliki CSV również z chmury. Obie funkcje działały prawidłowo w wersjach R 3.3.0 i R 3.4.0 do tej pory.

Używam wersji 3.4.1 i RStudio 1.0.143 w systemie Windows.

Oto mój 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

Teraz mam inny podobny błąd:

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

Wbudowany błąd nul wydaje się, że zniknął. Próbowałem także usunąć .Rhistory i .Rdata, a także usunąć mój podfolder pakietów i przeładować wszystkie pacakges. Przynajmniej ten nowy błąd wydaje się być spójny. Nie mogę znaleźć słowa "nieznany typ 100".

+0

Może masz duże obiekty w swoim środowisku, które są eksportowane do klastrów? Spróbuj wstawić to wywołanie foreach w swojej własnej funkcji. –

+0

To nie wydaje się być problemem - faktycznie usunąłem wszystkie obce obiekty w środowisku. – user2642948

+0

Czy możesz odtworzyć problem za pomocą funkcji, którą możesz nam podać? –

Odpowiedz

4

Występuje podobny błąd ... zwykle dzieje się na kolejnym uruchomionym skrypcie, gdy jeden z moich wcześniejszych skryptów został usunięty lub zatrzymałem go wcześniej. Może to być ta część, o której wspominasz: "Nie wiem, dlaczego czasami widzi wbudowany nul i zatrzymuje się", co może być błędem.

To ma kilka dobrych informacji, szczególnie, aby upewnić się, że zostawiasz 1 rdzeń do regularnego uruchamiania procesów Windows. Wspomina także: "Jeśli wystąpi błąd z którejkolwiek z tych funkcji, oznacza to zwykle, że zginął co najmniej jeden pracownik", co może poprzeć moją teorię dotyczącą awarii po błędzie.

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

Dotychczas moje rozwiązanie było ponownie zainicjować równoległego backend uruchamiając to znowu:

registerDoParallel(cl) 

To zazwyczaj działa potem ale ja nie zauważyć, że poprzednie sesje wielordzeniowe w moim menedżerze zadań nie odejdź, nawet z:

stopCluster(cl) 

Dlatego czasami uruchamiam ponownie R.

+0

Tak, miałem też problem z rdzeniami nie zatrzymującymi się nawet po 'stopCluster (cl)'. Spróbuję ponownie zainicjować backend. Próbowałem zmniejszyć liczbę rdzeni o 1 dla zwykłych procesów systemu Windows, ale to nie pomaga. – user2642948

+0

Po raz kolejny wypróbowałem kod i działało - ale jest to pierwszy raz w ciągu ostatnich 15 prób. Plik wyjściowy nie pokazuje tym razem niczego złego. Ale trudno budować zaufanie ..... – user2642948

+1

Trzy kolejne próby zakończyły się niepowodzeniem. Ponowne uruchamianie R, redukowanie rdzeni i ponowne inicjowanie równoległego backendu nie pomagają. – user2642948

2

Zauważyłem również, że sesje wielordzeniowe nie znikają z menedżera zadań.

Zmiana za pomocą: stopCluster(cl) na stopImplicitCluster() Pracowałem dla mnie. Z mojego czytania, to ma być używany podczas korzystania z „jednej linii” registerDoParallel(cores=x) vs

cl<-makeCluster(x) 
registerDoParallel(cl) 

My „przeczucie”, że jak Windows obsługuje klastry wymaga stopImplicitCluster, ale doświadczenie może się różnić.

Chciałbym skomentować, ale to jest (cue band) MY FIRST STACKOVERFLOW POST !!!

Powiązane problemy