メモリ上のオブジェクトとファイルの同期、あと排他制御
ファイルが壊れる問題について 朔をいじってます。
もともと朔でファイル(状態ファイル)を扱うときってこんな感じだったんですよ。
- ファイル(大量の行からなる)を読み込んでくる
- 全ての行について処理をする
- 更新したらファイルに保存
で、これを高速化するためにこんな風にしてました。
- メモリ上になければファイルを読み込んできて、メモリ上にもコピー
- 全ての行について処理をする
- 更新したらメモリとファイルに保存
これで真面目に排他制御しようとすると、こうなるんですね。
- ロック
- メモリ上になければファイルを読み込んできて、メモリ上にもコピー
- 全ての行について処理をする
- 更新したらメモリとファイルに保存
- ロック解放
これって処理の時間を、まんまロックしておかなければいけなくて、 うっかりするとデッドロックにもなりそうです。 そこで今回の変更ではこうなる予定です。
- 読み込み
- メモリ上にあればそれを返す
- ロック
- ファイルを読み込んできて、メモリ上にもコピー
- ロック解放
- 各行について次の処理
- 何か処理をする
- ロック
- その行をメモリ上に保存
- ロック解放
- 保存
- ロック
- 全ての行をファイルに保存
- ロック解放
感覚的にはSQLサーバ等のデータベースに近いでしょうか。 ループの中でupdateなりremoveなりを発行しているみたいな。