web-dev-qa-db-ja.com

grepを効率的に使用する方法

検索する小さなファイルがたくさんあります。 grepの事実上のマルチスレッドバージョンを探していましたが、何も見つかりませんでした。 grepの使用方法を改善するにはどうすればよいですか?今のところ私はこれをやっています:

grep -R "string" >> Strings
40
Legend

マルチコアプロセッサにxargsがインストールされている場合、誰かが興味を持っている場合に備えて、次のことから利益を得ることができます。

環境:

Processor: Dual Quad-core 2.4GHz
Memory: 32 GB
Number of files: 584450
Total Size: ~ 35 GB

テスト:

1。必要なファイルを見つけ、それらをxargsにパイプして、8つのインスタンスを実行するように指示します。

time find ./ -name "*.ext" -print0 | xargs -0 -n1 -P8 grep -H "string" >> Strings_find8

real    3m24.358s
user    1m27.654s
sys     9m40.316s

2。必要なファイルを見つけ、それらをxargsにパイプして、4つのインスタンスを実行するように指示します。

time find ./ -name "*.ext" -print0 | xargs -0 -n1 -P4 grep -H "string" >> Strings

real    16m3.051s
user    0m56.012s
sys     8m42.540s

。@Stephenの提案:必要なファイルを見つけて、xargsの代わりに+を使用してください

time find ./ -name "*.ext" -exec grep -H "string" {} \+ >> Strings

real    53m45.438s
user    0m5.829s
sys     0m40.778s

4。通常の再帰grep。

grep -R "string" >> Strings

real    235m12.823s
user    38m57.763s
sys     38m8.301s

私の目的のために、最初のコマンドはうまくいきました。

81
Legend

なぜ-n1が以下で使用されるのか疑問に思って、より高い値を使用した方が速くなりません(たとえば、-n8とするか、または省略して、xargsが正しいことを行います)?

xargs -0 -n1 -P8 grep -H "string"

複数のファイルで処理するためにフォークされた各grepを指定する方が効率的であるようです(-n1は、grepのargvで1つのファイル名のみを指定することを想定しています)-私が見ているように、システムで可能な最大のn(argc/argv最大長の制限に基づく)。そのため、新しいgrepプロセスを立ち上げるためのセットアップコストはそれほど発生しません。

4