6

我需要编写一个程序,在可能状态的大空间中执行并行搜索,在此过程中发现新区域(并开始探索),并且由于在其他地方获得的中间结果消除了可能性,因此对某些区域的探索提前终止在他们身上发现新的有用结果。搜索是使用相互密切合作运行的多个线程来执行的,以避免重新计算中间数据。

一个复杂的内部状态(包括几个线程的调用堆栈和它们使用的状态同步原语)必须在整个过程中维护和更新,并且没有明显的方法可以将计算分成可以顺序执行的独立块,每个块都可以节省并将一个小的中间结果传递给下一个。此外,没有办法将计算拆分为不相互通信的独立并行线程,而不会由于重新计算大量中间数据而产生过高的开销。

由于搜索域很大,该程序可能会运行数月才能产生最终结果。因此,在程序执行期间存在电源、硬件或操作系统故障的重大风险,这可能导致目前已完成的所有工作完全丢失。在这种情况下,程序将需要从头开始重新启动其所有计算。

在这种情况下,我需要一种可以防止数据完全丢失的解决方案。我想到了一个执行引擎/平台,它可以不断地将进程的当前状态保存到诸如冗余磁盘阵列或数据库之类的抗故障存储中。但我知道这种方法会显着减慢这个过程,甚至在某种程度上与预期的计算时间相比没有任何好处,包括由于可能的故障而重新启动。

事实上,我并不需要一个持续保存程序状态的理想解决方案,我可以轻松承受数小时甚至数天的工作损失。我想到的一个可能的重量级解决方案是在虚拟机中运行程序,不时保存其快照,并在可能的主机故障后从最近的快照恢复机器。这种方法还有助于在随机或可预防的客户操作系统故障后恢复程序状态。

是否有类似但更轻量级的解决方案仅限于保留单个进程的状态?或者您能建议任何其他可以解决我的问题的方法吗?

4

1 回答 1

1

您可能想看看使用允许大量线程以相对较低的成本运行的 Erlang。因为线程成本低,所以可以使用冗余来提高可靠性。

对于您提出的问题,三重冗余方案可能是可行的方法,其中定期检查三个(或更多)系统之间的同步将通过投票确定谁失败了。

于 2013-09-10T19:08:42.553 回答