okuyamaについて教えてもらったよ

かなり手の込んだ実装が為されている事に驚くばかり
22
Muga Nishizawa @muga_nishizawa

@okuyamaoo @kumagi なるほど、RandomAccessFile を利用してるんですか?

2011-06-15 17:17:14
iwase @okuyamaoo

@muga_nishizawa @kumagi そうです。RandomAccessFileを使っています。ある一定のValueのサイズまでは1つのファイルに固定長で書き出して、一定値を超えるサイズの部分はまた別のDataファイルを用意しておいてそちらに書き出してます。

2011-06-15 17:19:49
Muga Nishizawa @muga_nishizawa

@okuyamaoo @kumagi なるほど、ファイル内のデフラグも何かのタイミングでされてる感じですか?

2011-06-15 17:24:49
くまぎ @kumagi

@okuyamaoo @muga_nishizawa それって削除するときにディスク上に保存されているデータはどうなるのでしょうか?定期的にディスク上からもGCするのでしょうか?

2011-06-15 17:25:05
iwase @okuyamaoo

@kumagi @muga_nishizawa はい、削除はKeyとセットの位置だけまず消して、ディスク上のデータは一定周期でデフラグします。後、削除のタイミングで無効な位置をメモリ上のQueueに保持してデフラグまでの間再利用します。再利用データがない場合は取りあえず追記します

2011-06-15 17:31:11
くまぎ @kumagi

@okuyamaoo @muga_nishizawa なんと。細かい配慮が為されていますね…!デフラグ中のデータを読まれないように排他制御が必要だと思うんですがその間にリクエストへの応答が悪くなるのではないでしょうか?一時的にメモリに複製を作っておくなどの対策を取るのでしょうか?

2011-06-15 17:33:09
iwase @okuyamaoo

@kumagi @muga_nishizawa はい、デフラグ中は速度は落ちます。デフラグ中の追加(更新)、削除データは一時的なファイルをベースにしたListに追加しておいて、新しいデータファイルが出来た時点でListを元に処理をトレースして帳尻を合わせます。最後はSyncします

2011-06-15 17:48:04
くまぎ @kumagi

@okuyamaoo @muga_nishizawa なんと…ずいぶん工数のかかった工夫が実装されてますね…!Listを用いてる理由は何でしょうか?直感的にはMapでもよさそうな気がするのですが。

2011-06-15 17:56:44
iwase @okuyamaoo

@kumagi @muga_nishizawa Mapでも問題はないと思います。ファイルベースのリストを使った理由は、ファイルベースのリストを使ったのは1つはメモリ枯渇の対策と、読み出し時はひたすら追記で書き出したファイルを1方向に読み出しますので、(続く)

2011-06-15 18:00:56
iwase @okuyamaoo

@kumagi @muga_nishizawa 円盤HDDから高速に読み出せる点でしょうか。高速という部分は実は少し自信ないのですが。。。

2011-06-15 18:02:20
くまぎ @kumagi

@okuyamaoo @muga_nishizawa なるほど。読み出す→listに繋ぐ を繰り返せばO(n)で済む、という算段ですか。

2011-06-15 18:05:51
iwase @okuyamaoo

@kumagi @muga_nishizawa あっ、いえそこまでカッコ良くは出来てないです。。ただ、Listから読み出してその処理をトレースする際の読み出しが高速かなという程度です。一時領域をメモリにしたくなかった意識の方が強いです。(続く)

2011-06-15 18:11:59
iwase @okuyamaoo

@kumagi @muga_nishizawa (続き)別でKeyもValueも全てディスクのMapもあるんですが、こちらはListよりもさらに低速なので。現状Listにしています。でもこの考えはすごく参考になります。ありがとうございます。

2011-06-15 18:12:29
くまぎ @kumagi

.@okuyamaoo さんの設計思想がすごく勉強になる。

2011-06-15 18:12:56
iwase @okuyamaoo

@kumagi いえいえ、浅知恵です。。

2011-06-15 18:14:09
くまぎ @kumagi

@okuyamaoo @muga_nishizawa デフラグ作業用の一時領域さえディスクに置こうという事ですよね…?徹底した設計思想なんですね。ファイルサイズを適当な大きさで切り分けてるのであればあまり気にせずメモリに置いてもなんとかなりそうな気もしますが。

2011-06-15 18:17:17
iwase @okuyamaoo

@kumagi @muga_nishizawa はい、デフラグ中の一時領域です。デフラグは別スレッドで走っているので、その間もアクセスはあるため、デフラグを初めてから終わるまでの間に発生した処理がデフラグ完了後の新しいデータファイルに反映されていない可能性あるため、(続く)

2011-06-15 18:35:01
iwase @okuyamaoo

.@kumagi @muga_nishizawa (続き)デフラグ完了後、このリストの内容をデフラグ後データファイルに反映しています。メモリを使った方が高速なのは間違いないので、そこ切り替えれるようにするのも手ですね。

2011-06-15 18:36:58