うーん

昨日の晩に走らせた1620通りの結果がそろそろ出そうだ。今は8:42。8時間どころか12時間かかってしまった。でもまあ、これぐらいなら許容範囲か。100銘柄じゃなく60銘柄ぐらいに絞ればもっと時間を短縮できるだろう。

今回、2台のPCを検証に使っていて、1つをDBサーバ兼シミュレーション実行、1つをシミュレーション実行x2として3つのシミュレーションプロセスを非同期実行して時間を節約したんだけど、この仕組みを作っていてちょっとハマった。

パラメータの組み合わせを保存しておくテーブルをDB上に作って、このテーブルに未実行、実行中、実行済みのステータスを持たせる。各クライアントはこのテーブルの未実行の行をSELECT FOR UPDATE LIMIT 1で抜いてきて、実行中に状態を変更して、コメント列に誰が手をつけているのかシミュレーションプロセスに与えた名前を記入してコミットするような、動的に未実行のものを手が空いたプロセスが食べていく。こんな仕組みを最初は作った。

なんでか、最後にシミュレーション結果をファイルに落とすところでコンフリクトが発生する事が判明。同じパラメータの組を処理したプロセスが2つ以上存在した結果だ。どーもSELECT FOR UPDATEが効いていないっぽい;; ダーティーリードが発生してしまっている。これは・・・ MySQL調べるしかないのか;;

ひとまずの解決策としてあらかじめ、パラメータの組の担当プロセスを決めておく事で、同じ行を取りに行く事を抑制した。ラッキーなことに、最終的に3つのシミュレーションプロセスの処理力がほぼ同じだったので三等分で済んだ。まー、按分比を考えなきゃいけなくなったら、また面倒だけど・・・ あーもー、なんとかならんのか。