2011-08-29 5 views
8

Używam operacji równoległej przy użyciu klastra SOCK z pracownikami na komputerze lokalnym. Jeśli ograniczam zestaw, który przerabiałem (w jednym teście, używając 70 zamiast pełnych 135 zadań), wszystko działa dobrze. Jeśli przejdę do pełnego zestawu, otrzymam errror "Błąd w niezsobicie (lista-socklist [[n]]): błąd odczytu z połączenia"."Błąd w niezserializowaniu" - foreach/doSNOW/śnieg z SOCK (Windows)

  • Odblokowałem port w Zaporze systemu Windows (oba wejścia/wyjścia) i zezwolono na dostęp do Rscript/R.

  • Nie może to być problem z przekroczeniem limitu czasu, ponieważ limit czasu gniazda jest ustawiony na 365 dni.

  • To nie problem z danym zadaniem, ponieważ mogę uruchomić kolejno w porządku (również działa dobrze równolegle gdybym podzielić zbiór danych na pół i zrobić dwa oddzielne biegnie równolegle)

  • Najlepszym mogę przyjść z tym, że zbyt wiele danych jest przesyłanych przez gniazda. Wydaje się, że nie istnieje opcja klastrowania w celu ograniczenia przepustowości danych.

Nie rozumiem, jak postępować. Czy ktoś widział ten problem przed lub może zaproponować poprawkę?

Oto kod używam w konfiguracji klastra:

cluster = makeCluster(degreeOfParallelism , type = "SOCK" , outfile = "") 
registerDoSNOW(cluster) 

Edycja
Choć kwestia ta jest constent z całego zbioru danych, wydaje się również, od czasu do czasu ze zmniejszoną zbiór danych. Może to sugerować, że nie jest to po prostu problem z limitem danych.

Edycja 2
kopany głębiej i okazuje się, że moja funkcja w rzeczywistości ma losowy składnik, który sprawia, że ​​tak, że czasami zadanie zgłosi błąd. Jeśli wykonuję zadania seryjnie, to po zakończeniu operacji powiedziano mi, które zadanie nie powiodło się. Jeśli pracuję równolegle, pojawia się błąd "unserialize". Próbowałem owijać kod, który jest wykonywany przez każde zadanie w wywołaniu tryCatch z error = function (e) {stop (e)}, ale także generuje błąd "unserialize". Jestem zdezorientowany, bo myślałem, że śnieg radzi sobie z błędami, przekazując je mistrzowi?

+0

R jest ograniczone do 128 jednoczesnych połączeń otwartych ... może to część tego? –

+0

Testuję z 8 połączeniami. – SFun28

+0

Ale twoje pytanie mówi, że wszystko działa dobrze z 70 zadaniami, więc jestem zdezorientowany. –

Odpowiedz

2

Złożyłem ten problem autorowi SNOW, ale niestety nie było odpowiedzi.

Edytuj
Nie widziałem tego problemu od jakiegoś czasu. Przeniosłem się do Parallel/doParallel. Ponadto używam metody try() do zawijania dowolnego kodu, który zostanie wykonany równolegle. Nie mogę repro oryginalnego problemu.

+0

Jak się masz, to jest błąd w śniegu, a nie foreach i/lub doSNOW? –

+0

nie jest dodatnie. Odznaczam moją odpowiedź, dopóki nie będę mógł podać działającego przykładu. – SFun28

+0

Wygląda na to, że wiele węzłów roboczych próbuje odczytać z tego samego pliku na dysku twardym. Miałem kilka modeli działających równolegle, które napisałem do tego samego pliku, co prowadzi do różnego rodzaju przypadkowych błędów. Jednak nie dostarczysz zbyt wielu szczegółów na temat tego, co dokładnie robi funkcja, jeśli uzyskuje dostęp do dysku twardego, więc do pewnego stopnia zostaliśmy zgadywani. –

Powiązane problemy