sed のファイル出力コマンド w は遅いのでリダイレクトした方が良い

目次

sed のファイル出力コマンド w は処理速度が遅いようだ。
以下の調査は、ファイル先頭200万件を別ファイルに出力する処理のパフォーマンスを、4パターンでで比較したもの。

  1. sed の w コマンドの場合 → 5.882s
  2. sed の出力をリダイレクトする場合 → 0.320s
  3. awk の場合 → 0.443s
  4. 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

関連ページ