質問: Linux プログラミング初心者です. 研究の実験用に実行時間が数日以上かかるプログラムを使っているのですが, 今度学内で停電を伴う作業が予定されているとのことで, シャットダウンに伴いプロセスを中断しなければなりません. 教授には計算途中の状態をファイルに書き出して, 再起動後にそれを読み込んで再開するようにプログラムを改良できないのかと言われたのですが, どのようにしたらそれが実現できるのか全くわかりません. メモリの内容を書き出すくらいならできるのかもしれませんが, それをメモリに読み込むことはできるのでしょうか? OS は Ubuntu 16.04 LTS です. 方法があるかないかだけでもわかれば良いので言語はとりあえず不問です. ちなみに, ハイバネーションというものがあることは知っているので, それ以外でお願いします. よろしくお願いします. 追記 私が実際に使用しているのは非商用ソルバなので, それに上記のような機構を組み込むのは不可能だと思いますが, 例えばアルゴリズムを実装して最適化問題を解く場合には長時間実験が必要になることもあるので, その際にはこういった方法を取ることができるのかなという, 興味からの質問でした. 恐らく, 尋ねてきた教授もこのような状況を想定しています.
回答: 数値シミュレーション(流体力学とか)かなにかやってらっしゃるのでしょうか? 数値シミュレーションの場合、計算の途中結果を保存して、後で再開するようなプログラムの作り方はよく行われるようです。 シミュレーションプログラムは、シミュレーション対象を表現した変数(流体ならメッシュの節点の流速を保持する配列とか)を持っているはずです。 それらの変数はシミュレーション開始時に初期化され、シミュレーションの繰り返しと共に、更新されていきます。 プログラムの流れはだいたい次のような感じです ``` 変数を初期化; 以下を必要な回数繰り返し: 1ステップシミュレーションする(普通は時刻の増分⊿t だけ進めるための計算をする) 途中結果を必要に応じてファイルに出力する 最終結果をファイルに出力する ``` このようなプログラムを中断/再開可能にするには、以下のようにします。 (1) プログラムの起動時に、計算処理を打ち切るべき時刻を指定できるようにし、ループする度に時刻をチェックし、指定時刻が来てしまったら、その時点でループを抜けて、その時点のシミュレーション対象の変数の内容を、後で読み込めるような形式でファイルに保存する。 (2) プログラムの起動時に、ゼロからシミュレーションを開始するモードのほかに、以前保存しておいたファイルの内容を読み込んで「停止したときの状態」を再現し、シミュレーションを途中の回から再開するモードの2つの起動モードが選べるようにする。 ここでのポイントは、「メモリの内容を意識せずにドバーっとファイルに書き出す」のではなくて「自分で用意した変数の内容を数値として書き出す」ということです。そうであれば再開時には「数値データを変数に読み込む」処理を作れば、再開できます。 これで、指定時刻が来たら止まってくれるプログラム、になります。 ところで、質問では「プログラムを使っている」と書いてらっしゃるので、自分で作成したプログラムというわけではないのでしょう。だ ゚とすると、そのプログラムを変更するのはハードルが高いのかも知れませんね。 もし立派なプログラム(商用のパッケージとか)なのだとしたら、すでに保存/再開機能を持っているかも知れません。