SUFARY ホームページの伝言版で、suffix array のインデックス作成速度が遅 いという書き込みがありましたのでちょっと解説。2月後半に、suffix array でのインデックス作成速度の向上作業にちょっと手を染めていました。 結局、スワッピングをどれだけ押えることができるかというのがポイント。日 本語テキストだと、テキストサイズの約2倍の大きさのインデックスが必要に なります。例えば、200M のテキストだと、インデックスは 400M といった具 合。手順として、この 400M のインデックスを 200M のテキストを参照しなが らソート(クイックソート)するという作業が必要になります。ここで、1G く らいメモリのあるマシンだと、600M 全部がメモリ載るのでかなり高速に処理 ができます。でも、メモリ 200M くらいだとスワッピングが起こりまくり(ハー ドディスクがかたかたうるさくなる)、いつまでたっても処理が終わらなくなっ てしまいます。200M のメモリで、400M の long int をクイックソートすると いうのが、スワッピングの元凶です。そこで、400M の long int を数十個に 分割して、それぞれに対してクイックソートして(サイズが小さくなるのでス ワッピングもかなり押えられます)、最後にマージするようにしました。これ で、何とか使える速度になりました。実はそこでいろいろ面白いことをやって いるんですけど、そこらへんは SUFARY の解説書にでも書くつもりです。
失敗事例。 最初、クイックソートの代わりにマージソートなら速くなるかなと 思って実装してみたんだけど、だめだった。 前半のマージは良いんだけど、 ある段階のマージでスワッピングが起こり始め、 その後はスワッピングだらけで使い物にならない。 まあ、アルゴリズムの性質上そうなりそうではあったけど。残念。