sortコマンドで複数のソート済みファイルを連結して1つのソート済みファイルを高速に作成する
はじめに
巨大なソート済みファイルを連結して1つのソート済みファイルにしたかったが、巨大すぎて処理に時間がかかって困ってしまいました。
連結元のファイルはソート済みなので、うまいことマージすれば高速に処理できそうな気もします。
うまい方法が無いか調べてみました。
検証環境
検証準備
1〜1000000 までの数値が格納されている2つのファイル a.txt
、 b.txt
を用意します。
これを連結し、全体としてソートされているファイルを作成したいと思います。
sort
コマンドで普通にソート
sort
コマンドに複数のファイル名を渡すことで、連結し全体としてソートすることができます。time
コマンドと一緒に実行し実行速度や負荷を計測してみます。
3回計測します。
ユーザーCPU時間 | システムCPU時間 | CPU使用率 | 処理時間(経過時間) |
---|---|---|---|
1.31s user | 0.25s system | 269% cpu | 0.579 total |
1.27s user | 0.23s system | 278% cpu | 0.540 total |
1.26s user | 0.22s system | 287% cpu | 0.512 total |
CPUが複数格納されているPCですので、並列処理してくれたみたいですね。
頑張ってくれました。
sort -m
コマンドでマージのみ行う
sort
コマンドには-m
オプションというものがあります。
ヘルプを引いてみます。
すでにソートされているファイル群をソートせずマージのみ行う、というオプションです。
ではこちらを使ってファイルを連結してみます。
ブレがあるかもしれませんので、3回試行してみます。
ユーザーCPU時間 | システムCPU時間 | CPU使用率 | 処理時間(経過時間) |
---|---|---|---|
0.23s user | 0.03s system | 90% cpu | 0.288 total |
0.23s user | 0.03s system | 96% cpu | 0.265 total |
0.23s user | 0.03s system | 96% cpu | 0.268 total |
処理時間は約1/2 、 CPU処理時間は約1/6 になりました。
両者が本当に同じ値になっているかを確認してみます。
どうやら問題がないようです。
ひとこと
連結対象のデータファイルがすでにソート済みの場合には、 -m
オプションを使って効率化を図れますね。
ディスカッション
コメント一覧
まだ、コメントがありません