これには2つの簡単な解決策があります。基本的に、xargs
またはを使用しparallel
ます。
xargsアプローチ:
あなたは使うことができxargs
てfind
、次のように:
find . -type f -print0 | xargs -0 -P number_of_processes grep mypattern > output
起動するnumber_of_processes
プロセスの最大数で置き換える場所。ただし、これは、パフォーマンスがI / O制限されている場合に重要なパフォーマンスを提供することを保証するものではありません。この場合、I / Oの待機時間の損失を補うために、より多くのプロセスを開始しようとする場合があります。
また、findを含めると、変更時間などのファイルパターンだけでなく、より高度なオプションを指定できます...
Stéphaneのコメントで説明されているように、このアプローチで考えられる問題の1つは、ファイルが少ない場合、xargs
十分な数のプロセスを開始できない可能性があることです。解決策の1つは、-n
オプションを使用xargs
して、一度にパイプから取得する引数の数を指定することです。設定-n1
するとxargs
、各ファイルごとに新しいプロセスが強制的に開始されます。これは、ファイルが非常に大きく(この質問の場合のように)、ファイルの数が比較的少ない場合に望ましい動作です。ただし、ファイル自体が小さい場合、新しいプロセスを開始するオーバーヘッドにより、並列処理の利点が損なわれる可能性-n
があります。この場合、値が大きいほど優れています。したがって、-n
ファイルのサイズと数に応じてオプションを微調整することができます。
並列アプローチ:
別の方法は、Ole Tange GNU Parallel toolを使用することですparallel
(こちらから入手できます)。これにより、並列処理をよりきめ細かく制御でき、複数のホストに分散させることもできます(たとえば、ディレクトリを共有する場合に役立ちます)。パラレルを使用した最も単純な構文は次のとおりです。
find . -type f | parallel -j+1 grep mypattern
このオプション-j+1
は、マシンのコア数を超える1つのプロセスを開始するように並列に指示します(これは、I / Oの制限されたタスクに役立つ場合があります。
Parallelには、xargs
各プロセスからの出力の順序を実際に保持し、連続した出力を生成するという利点もあります。たとえば、xargs
プロセス1が行を生成する場合p1L1
、プロセス2が行を生成しp2L1
、プロセス1が別の行を生成するp1L2
場合、出力は次のようになります。
p1L1
p2L1
p1L2
一方parallel
、出力では次のようになります。
p1L1
p1L2
p2L1
これは通常、xargs
出力よりも便利です。