web-dev-qa-db-ja.com

複数のファイルから並行して読み取るシェルスクリプト

並行して実行され、複数のファイルで文字列を検索するスクリプトを作成する必要があります。
多くのオプションを試しましたが、プロセッサの速度が低下します。

4
helloworld0722

ファイルが別々のディスクにある場合は、各ディスクで1つのgrepコマンドを実行します。

同じディスク上のファイルの場合、ボトルネックはディスクからの読み取りです。複数のファイルから並行して読み取ると、速度が低下するだけです。

ファイルがRAID-0アレイ上にある場合、2つの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コマンドが最速です。

GNU parallel:

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が順次高速に実行されることを示す他のコメントは正しいことに注意してください。

2
sandesh247

私はあなたのファイルがかなり大きいと推測しています(そうでなければ、おそらくジョブの並列化を気にしないでしょう)。

GNU parallelの提案は良いです(そしてGNUのxargsにも-P並列実行のオプション)[〜#〜] but [〜#〜] 1つまたは複数のファイルのgrepは、CPUバウンドではなく、I/Oバウンド操作であるため、次のことができます。複数のgrepを並行して実行すると、ディスクアクセスをめぐって競合する複数のプロセスがあるため、実際には処理速度が低下することがわかります。

ここでの制限要因はI/O速度であり、CPUパワーではありません。単一のgrepプロセスでさえ、おそらくほとんどの時間をディスクからのデータの待機に費やしています(つまり、CPUはほとんどアイドル状態です)。

ファイルがディスク上で物理的に互いに近接していない場合、ディスクヘッドがより多く移動する必要があるため、[〜#〜]多くの[〜#〜]倍遅くなる可能性があります。もちろん、これはSSDやRAMディスク、またはファイルがすでにキャッシュされている場合は問題になりません)

2
cas