改行文字を使用するgrepは速いですか?

改行文字を使用するgrepは速いですか?

改行文字が削除された「正規化形式」に変更された大容量ファイルがあります。このファイルの速度を上げたいです。次のようにしてgrepを最適化できることを知っていますgrep 'partofpattern' | grep -E 'partofpattern [[:digit:]]+'。つまり、grepにパターンのより単純な部分を含む行を検索させ、パターン部分を含むいくつかの行でgrepを2番目に実行させます。これはgrepが何らかの方法で1行ずつ動作すると思うようにします。それでは、改行なしで大きなファイルに改行を追加すると、grepの速度が速くなりますか?

答え1

おそらくfmtどちらかを使用する必要があります。これは:foldprfmt

until [ $((i=i+1)) -gt 10000 ]
do  printf %s\  words and more words
done | fmt

出力

words and more words words and more words words and more words words
and more words words and more words words and more words words and more
words words and more words words and more words words and more words
words and more words words and more words words and more words words
and more words words and more words words and more words words and more
#...and so on for a long time

grepバッファーは、改行境界にバッファーをダンプできない限り、重大なロードの下で崩壊するしかありません。

たとえば、

time (
    tr \\0 \\n < /dev/zero | 
    sed 'c words and words and words and words and words and' | 
    tr -d \\n | 
    grep -o words
)
grep: memory exhausted
49.42s user 44.93s system 229% cpu 41.070 total

少し時間がかかりましたが、システムに空のRAMが多く、まだ1分以内にクラッシュが発生しました。

だから:

fmt <file | grep search

それでも、ファイルに信頼できる単一の文字列区切り文字がある場合は、より信頼性が高くなります。

tr ${delim} \\n <file | grep search

答え2

grepはsedと同様に、確かにラインベースで動作することができます。検索速度は必ずしも高速ではありませんが、一致する行の出力を生成する方が速くなければなりません。

関連情報