sed のファイル出力コマンド w は遅いのでリダイレクトした方が良い
目次
sed のファイル出力コマンド w は処理速度が遅いようだ。
以下の調査は、ファイル先頭200万件を別ファイルに出力する処理のパフォーマンスを、4パターンでで比較したもの。
- sed の w コマンドの場合 → 5.882s
- sed の出力をリダイレクトする場合 → 0.320s
- awk の場合 → 0.443s
- head の場合 → 0.139s
リダイレクトした方が明らかに速い。やり方次第で10倍以上の差が出る。
なお、単純にファイルの先頭を抽出する場合は head が高速だが、ファイルの途中を抽出する場合は、head と tail を組み合わせることになり、その場合の処理速度は遅かった(検証結果は省略、time head -n 4000000 sample.txt | tail -n 2000000 > sample5.txt
などで確認可能)。
1$ # レコード数=1000万件のファイルを作成
2$ seq -f "%07.0f" 1 1000000 > sample.txt
3$
4$ # sed の w コマンドの場合
5$ time sed -n -e '1,2000000w sample1.txt' -e '2000000q' sample.txt
6
7real 0m5.882s
8user 0m0.651s
9sys 0m5.208s
10$
11$ # sed の出力をリダイレクトする場合
12$ time sed '2000000q' sample.txt > sample2.txt
13
14real 0m0.320s
15user 0m0.296s
16sys 0m0.020s
17$
18$ # awk の場合
19$ time awk 'NR<=2000000;NR==2000000{exit}' sample.txt > sample3.txt
20
21real 0m0.443s
22user 0m0.409s
23sys 0m0.024s
24$
25$ # head の場合
26$ time head -n 2000000 sample.txt > sample4.txt
27
28real 0m0.139s
29user 0m0.111s
30sys 0m0.022s
31$
32$ # 上記の出力ファイルに差異がないことを確認
33$ diff -s sample{1,2}.txt; echo $?
34Files sample1.txt and sample2.txt are identical
350
36$ diff -s sample{1,3}.txt; echo $?
37Files sample1.txt and sample3.txt are identical
380
39$ diff -s sample{1,4}.txt; echo $?
40Files sample1.txt and sample4.txt are identical
410