2013-08-05 36 views
6

Potrzebuję napisać program, który wykonuje wyszukiwanie równoległe na dużej przestrzeni możliwych stanów, odkrywając nowe obszary (i ich eksplorację) i eksplorując niektóre obszary są kończone wcześnie, ponieważ pośrednie wyniki uzyskane w innym miejscu eliminują możliwość znalezienia w nich nowych użytecznych wyników. Wyszukiwanie odbywa się przy użyciu wielu wątków działających we wzajemnej ścisłej współpracy w celu uniknięcia ponownego obliczania danych pośrednich.Program odporny na awarie zasilania/sprzętu/OS

Złożony stan wewnętrzny (w tym stosy wywołań wielu wątków i prymitywów synchronizacji stanu, z których korzystają) musi być utrzymywany i aktualizowany podczas całego procesu, i nie ma wyraźnego sposobu podzielenia obliczeń na pojedyncze fragmenty, które można wykonać sekwencyjnie, każdy zapisuje i przechodzi mały wynik pośredni do następnego. Ponadto, nie ma możliwości rozdzielenia obliczeń na niezależne, równoległe wątki, które nie komunikują się ze sobą, bez nakładania nadmiernego obciążenia na skutek ponownego obliczenia dużej ilości danych pośrednich.

Ze względu na dużą domenę wyszukiwania program prawdopodobnie trwałby kilka miesięcy przed uzyskaniem ostatecznego wyniku. W związku z tym istnieje znaczne ryzyko awarii zasilania, sprzętu lub systemu operacyjnego podczas wykonywania programu, co może doprowadzić do całkowitej utraty pracy wykonanej do tej pory. W takim przypadku program będzie musiał ponownie uruchomić wszystkie swoje obliczenia od zera.

Potrzebuję rozwiązania, które może zapobiec całkowitej utracie danych w takich przypadkach. Myślałem o silniku wykonawczym/platformie, który stale zapisuje bieżący stan procesu do odpornego na awarie magazynu, takiego jak nadmiarowa macierz dyskowa lub baza danych. Rozumiem jednak, że takie podejście może znacznie spowolnić proces, nawet w stopniu, w którym nie byłoby żadnych korzyści w porównaniu do oczekiwanego czasu obliczeń, w tym ponownego uruchomienia z powodu możliwych awarii.

W rzeczywistości, nie potrzebuję idealnego rozwiązania, które stale zapisuje stan programu i mogę z łatwością utracić kilka godzin, a może nawet dni pracy. Możliwym rozwiązaniem wagi ciężkiej, które przychodzi mi na myśl, jest uruchamianie programu wewnątrz maszyny wirtualnej, zapisywanie jego migawek od czasu do czasu i przywracanie komputera po możliwej awarii hosta z niedawnej migawki. Takie podejście może również pomóc w odzyskaniu stanu programu po losowej lub możliwej do uniknięcia awarii systemu-gościa.

Czy istnieje podobne, ale bardziej lekkie rozwiązanie ograniczone do zachowania stanu pojedynczego procesu? Czy mógłbyś zaproponować jakieś inne podejście, które może rozwiązać mój problem?

+0

Rozwiązanie VM nie jest tak naprawdę ciężkie IMO (chociaż myślę z perspektywy programisty, a dodanie złożonego stanu oszczędzania i ponownego załadowania do wielowątkowego procesu sprawia, że ​​zaczynam się lękać) i jeśli potrafisz zintegrować proste " wstrzymać "mechanizm do procesu eksploracji, podczas gdy VM zapisuje migawkę, po to, by być wyjątkowo bezpiecznym - to byłby mój preferowany wybór. –

+0

Istnieje wiele programów do zapisywania "punktów kontrolnych" tam ... ale nie wspominasz systemu operacyjnego ani nawet języka programowania, którego zamierzasz użyć. – idfah

Odpowiedz

1

Możesz chcieć spojrzeć na użycie Erlanga, który pozwala na uruchamianie dużej liczby wątków przy stosunkowo niskich kosztach. Ponieważ koszt nici jest niski, można zastosować redundancję w celu zwiększenia niezawodności.

Dla przedstawionego problemu, schemat potrójnej redundancji może być drogą, gdzie okresowe kontrole synchronizacji pomiędzy trzema (lub więcej) systemami byłyby ustalane przez głosowanie, które nie powiodło się.

+0

Używając tabel 'mnesia' można zapisać stan nadmiarowo na> 1 komputerze. – haavee