我需要编写一个程序,在可能的状态的大空间中执行并行搜索,在此过程中发现新区域(并开始探索),并在某些区域的探索作为其他地方获得的中间结果提前终止消除了在其中发现新的有用结果的可能性。使用多个线程进行搜索,这些线程彼此密切合作,以避免重新计算中间数据。
在整个过程中必须维护和更新复杂的内部状态(包括它们使用的多个线程和状态同步原语的调用堆栈),并且没有明显的方法将计算拆分为可以按顺序执行的隔离块,每个保存并将一个小的中间结果传递给下一个。此外,没有办法将计算分成不相互通信的独立并行线程,而不会因重新计算大量中间数据而产生过高的开销。
由于搜索域较大,该程序可能会在产生最终结果之前运行数月。因此,在程序执行期间存在电源,硬件或操作系统故障的重大风险,这可能导致完成当前已完成的所有工作的丢失。在这种情况下,程序将需要从头开始重新启动所有计算。
我需要一种能够防止在这种情况下完全丢失数据的解决方案。我想到了一个执行引擎/平台,它可以将进程的当前状态持续保存到像冗余磁盘阵列或数据库这样的防故障存储中。但据我所知,这种方法可以显着减慢这一过程,甚至达到与预期的计算时间相比没有任何好处的程度,包括由于可能的故障导致的重启。
事实上,我不需要持续保存程序状态的理想解决方案,而且我可以轻松承担数小时甚至数天的工作损失。我想到的一个可能的重量级解决方案是在虚拟机内运行程序,不时保存其快照,并在最近的快照可能发生主机故障后恢复计算机。此方法还可以帮助在随机或可预防的客户操作系统故障后恢复程序状态。
是否有类似但更轻量级的解决方案仅限于保留单个进程的状态?或者你能否提出任何其他可以解决我问题的方法?
答案 0 :(得分:1)
您可能希望使用Erlang,它允许大量线程以相对较低的成本运行。由于线程成本低,可以使用冗余来提高可靠性。
对于您提出的问题,可能需要采用三重冗余方案,其中三个(或更多)系统的同步定期检查将通过投票决定失败。