User:Millie Inoue/外部ソーティング

外部ソーティングとは巨大なデータを扱うことのできるソートアルゴリズムのことである. 通常コンピュータの主要メモリ(通常はRAM)サイズよりデータサイズが大きい際に使用される. 一般的にこのアルゴリズムでは、ソートとマージを組み合わせた手法を用いる. ソート段階では、主要メモリに収まるサイズのデータをファイルなどから読み取り、ソートし、一時的なファイルに書き込む. マージ段階では一時的に作られたソートファイルを統合する.

外部マージソート
外部ソートの一例として外部マージソートアルゴリズムが挙げられる. これはある巨大データのRAMに収まる大きさの部分的データをソートし、マージする方法である. 例えば900MBのデータをRAMにおいて100MBのみを使用することによりソートするためには、
 * 1) データ100MBをメインメモリーに読み込み、クイックソートのような通常の方法によってソートする.
 * 2) ディスクにソートされたデータを書き込む.
 * 3) 100MBごとの全ての部分データがソートされるまで1, 2を繰り返す(900MB/ 100MBで9つの部分データがあるはずである). できた9つのデータを一つのファイルにまとめる.
 * 4) 部分データそれぞれのファイルの最初の10MB(= 100MB/ (9部分データ+1))をメインメモリの入力バッファーに読み込み、残りの10MBをアウトプットバッファーに割り当てる.(実際には、アウトプットファイルをより大きいものにしてインプットファイルをやや小さめに作っておくとより効率が良くなる.)
 * 5) 9-way マージを行う. 結果をアウトプットバッファーに書き込む. アウトプットバッファーが全て埋まったら、最終結果を書くファイルに書き込み、アウトプットバッファーを殻にする. これを部分ファイルの中身がなくなるまで続ける. このステップがこの外部マージソートにおいて肝となる部分で、マージにおいて、部分データファイルから連続的にデータの読み込みをするために、部分データファイルを全て最初から読み込む必要がなくなるのである.

パスの追加
上記例では２つの手順(パス)を用いたソートを紹介した. ソートに続くマージという方法である. ここで、通常のマージソートのように２つの部分ファイルを１つの部分ファイルにマージすることを繰り返す方法ではなく、全ての部分ファイルを一気にマージしたことに注目しよう(この場合結果的に logn の計算量が必要とされた). この手法(マージ回数を少なくする方法)を取った理由としては、部分的ファイルから値を取り出したり、書き込んだりするためにはディスクへのアクセスが必要(通常この動作は遅い)で、ファイルを開く、閉じるという動作を少なくすることにより、処理速度が遅くなることを防ぐためである.

しかしながら、少ないマージ回数でマージを行う際にはトレードオフがあることを忘れてはならない. この手法において、全体のデータの量が莫大になり部分的ファイルの数が多くなると、一つ一つの部分ファイルから一度に読み込むことのできるデータ量は少なくなる. 例えば、50GBのデータを100MBのRAMを使用してソートすることを考えてみよう. この場合一つのマージのみを行うことでソートしようとするのは効率的ではない. 50GB / 100MBで500個の部分的データが存在することになり、100MB / (500+1) ≅200KBをそれぞれの部分データファイルから読み込むことになるが、これでは繰り返し回数が多くなり、全体の時間が遅くなる. これは、２回マージを行うことで解決する. 具体的な手順としては以下のようになる: この方法により、３回マージを行う手法に移行する方が得になる場合より、少なくとも500GBのデータを1GBのメインメモリーを使用するだけでソートすることが可能になる.
 * 1) 上記の方法同様部分的データをソートする.
 * 2) 25個の部分的データをマージすることにより、20個の部分的データファイルを得る.
 * 3) 20個の部分的データファイルをマージして一つにする.