6

可能性のある状態の広い空間で並列検索を実行するプログラムを作成する必要があります。その過程で新しい領域が発見され (そしてその探索が開始され)、他の場所で得られた中間結果が可能性を排除するため、一部の領域の探索は早期に終了します。それらの中で新しい有用な結果を発見すること。検索は、中間データの再計算を回避するために、相互に強力に連携して実行される複数のスレッドを使用して実行されます。

複雑な内部状態 (複数のスレッドの呼び出しスタックとそれらが使用する状態同期プリミティブを含む) は、プロセス全体で維持および更新する必要があります。小さな中間結果を次の結果に渡します。また、大量の中間データの再計算による法外なオーバーヘッドを課すことなく、互いに通信しない独立した並列スレッドに計算を分割する方法はありません。

検索ドメインが大きいため、プログラムは最終的な結果が得られるまで数か月かかる可能性があります。したがって、プログラムの実行中に電源、ハードウェア、または OS に障害が発生し、それまでに実行されたすべての作業が完全に失われる危険性が非常に高くなります。そのような場合、プログラムはすべての計算を最初からやり直す必要があります。

このような場合に完全なデータ損失を防ぐことができるソリューションが必要です。プロセスの現在の状態を、冗長ディスク アレイやデータベースのような障害に強いストレージに継続的に保存する実行エンジン/プラットフォームを考えました。しかし、このアプローチは、起こりうる障害による再起動を含む予想される計算時間と比較してメリットがない場合でも、プロセスを大幅に遅くする可能性があることを理解しています。

実際、プログラムの状態を継続的に保存する理想的なソリューションは必要ありません。何時間も、場合によっては何日もかかる作業の損失に簡単に耐えることができます。私の頭に浮かぶ考えられる重い解決策は、仮想マシン内でプログラムを実行し、そのスナップショットを時々保存し、ホスト障害の可能性がある後に最近のスナップショットからマシンを復元することです。このアプローチは、ランダムまたは予防可能なゲスト OS 障害の後にプログラムの状態を回復するのにも役立ちます。

単一のプロセスの状態を保持することに限定された、同様の、しかしより軽量なソリューションはありますか? または、私の問題を解決できる他のアプローチを提案できますか?

4

1 に答える 1

1

比較的低コストで多数のスレッドを実行できる Erlang の使用を検討することをお勧めします。スレッドのコストが低いため、冗長性を使用して信頼性を向上させることができます。

あなたが提示した問題については、3つ(またはそれ以上)のシステム間で同期を定期的にチェックすることで、誰が失敗したかを投票によって決定する、トリプル冗長スキームが適している可能性があります。

于 2013-09-10T19:08:42.553 に答える