大きなデータをソートする - merge sort by sort

諸事情により,メモリに入りきらない大きなデータをソートする必要が出てきた.
当然勉強したばかりのマージソートを実装しようと思ったのだが,思いのほか面倒くさそうなので,既存のUnixコマンドにはマージソートが実装されていないのかを調べてみた.


・・・当然ながらあった.
実装する前に気がついてよかった.

覚えておくと便利なオプション

-S
使用メモリ容量の上限を設定 e.g., sort -S 500M
-m
ソート済みのファイルマージするオプション e.g., sort -m hoge1.sorted hoge2.sorted hoge3.sored > hoge.sorted
-T
一時ファイルの保存先を変更する e.g., sort -T ./
-n
数値として比較
-r
逆順でソート(数値の場合,降順)

これらの知識を総動員して実行してみる.

> sort -S 500M *.sorted > all.sorted
/tmp: write failed, filesystem is full
sort: write failed: /tmp/sortqxe56H: No space left on device

なんかエラーが出てくる.
「このファイルでかすぎてtmpファイルに収まんね」という意味
オプションでtmpファイルの位置を変更すればOK


うまくいった.
あとはこれをuniq -cするだけ

> uniq -c all.sorted > all.count