検索する小さなファイルがたくさんあります。 grep
の事実上のマルチスレッドバージョンを探していましたが、何も見つかりませんでした。 grepの使用方法を改善するにはどうすればよいですか?今のところ私はこれをやっています:
grep -R "string" >> Strings
マルチコアプロセッサに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
私の目的のために、最初のコマンドはうまくいきました。
なぜ-n1
が以下で使用されるのか疑問に思って、より高い値を使用した方が速くなりません(たとえば、-n8とするか、または省略して、xargsが正しいことを行います)?
xargs -0 -n1 -P8 grep -H "string"
複数のファイルで処理するためにフォークされた各grepを指定する方が効率的であるようです(-n1は、grepのargvで1つのファイル名のみを指定することを想定しています)-私が見ているように、システムで可能な最大のn(argc/argv
最大長の制限に基づく)。そのため、新しいgrepプロセスを立ち上げるためのセットアップコストはそれほど発生しません。