大きなデータをソートする - 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