並列に実行され、複数のファイルから文字列を検索するスクリプトを作成する必要があります。
さまざまなオプションを試しましたが、プロセッサが遅くなりました。
答え1
ファイルが別のディスクにある場合は、grep
各ディスクでコマンドを実行します。
同じディスク上のファイルの場合、ボトルネックはディスクから読み取られています。複数のファイルを並列に読み込むと、速度が悪くなります。
ファイルがRAID-0アレイにある場合は、grep
両方のコマンドを同時に実行して速度を上げることができます。実際に時間を取得していることを確認するには、ベンチマークテストを実行してください。低技術アプローチ:
grep file1 file2 file3 &
grep file4 file5 file6
そしてGNUパラレル:
parallel -j 2 grep ::: file1 file2 file3 file4 file5 file6
以下からファイルを取得する場合find
:
find … -print0 | parallel -0 -j 2
grep
覚えておいてください:ファイルが同じディスクにある場合は、単一のコマンドが最も高速です。
答え2
私はあなたのファイルが非常に大きいと推測します。そうでなければ、おそらく作業の並列化を気にしないでしょう。
GNUparallel
の提案は良いです(GNUには並列実行オプションxargs
もあります)-P
しかし、1つ以上のファイルをgrepingすることはCPU集約的なタスクではなく、I / O集約的なタスクであることを考慮すると、ディスクアクセスのために競合する複数のプロセスがあるため、複数のgrepを並列に実行すると実際に速度が遅くなることがわかりますできます。
ここで、制限要因は CPU パフォーマンスではなく I/O 速度です。単一のgrepプロセスでも、ほとんどの時間がディスク上のデータを待つのに費やすことができます(つまり、CPUはほとんどの時間アイドル状態です)。
ディスク上のファイルが物理的に互いに近づかない場合たくさんディスクヘッドがより多く動く必要があるため、速度が遅くなります(もちろん、SSDやRAMディスクでは問題にならない、またはファイルがすでにキャッシュされている場合は問題になりません)。
答え3
GNUの並列性を試してみてください。
find . -type f | parallel -k -j150% -n 1000 -m grep -H -n STRING {}
(からhttp://www.gnu.org/software/parallel/man.html#example__parallel_grep)
編集:他の説明では、ボトルネックがIOの場合、grepが順番に速く実行されることに注意してください。これは正しいです。