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

目次

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

  1. sed の w コマンドの場合 → 2.810s
  2. sed の出力をリダイレクトする場合 → 0.180s
  3. awk の場合 → 0.223s
  4. head の場合 → 0.089s

リダイレクトした方が明らかに速い。やり方次第で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	0m2.810s
 8user	0m0.325s
 9sys	0m2.479s
10$
11$ # sed の出力をリダイレクトする場合
12$ time sed '2000000q' sample.txt > sample2.txt
13
14real	0m0.180s
15user	0m0.167s
16sys	0m0.013s
17$
18$ # awk の場合
19$ time awk '1;NR==2000000{exit}' sample.txt > sample3.txt
20
21real	0m0.223s
22user	0m0.203s
23sys	0m0.016s
24$
25$ # head の場合
26$ time head -n 2000000 sample.txt > sample4.txt
27
28real	0m0.089s
29user	0m0.070s
30sys	0m0.017s
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

関連ページ