GNU Parallel - m個の正規表現を見つけるためにn行をgrepします。

GNU Parallel - m個の正規表現を見つけるためにn行をgrepします。

GNUパラレルm個の正規表現を見つけるためにn行をgrepします例示的なガイドラインは次のとおりです。

CPUが制限要素の場合は、正規表現を並列化する必要があります。

cat regexp.txt | parallel --pipe -L1000 --round-robin grep -f - bigfile

これにより、CPUごとに1つのgrepが実行され、CPUごとに1回ずつ大きなファイルが読み取られます。ただし、これは並行して実行されるため、最初の読み取り以外のすべての読み取りはRAMにキャッシュされます。

したがって、この例では、GNUはparallelgrepの並列インスタンスから正規表現を丸め、それぞれ個別に読み込みます。上記のドキュメントに示されているように、ディスクキャッシュを使用すると、ディスクから一度だけ読み取ることができます。regex.txtgrepbigfilebigfile

parallel私の質問はこれです。上記のアプローチは、読み取りの各並列インスタンスからGNUループレコードを取得することに関連する他のアプローチよりもパフォーマンスの面で優れていると考えられているようです。bigfilegrepregexp.txt

cat bigfile |  parallel --pipe -L1000 --round-robin grep -f regexp.txt -

なぜですか?私が見ることができるように、ディスクキャッシュが実行されていて、bigfileどちらregexp.txtの場合もディスクから一度読み込まれると仮定します。私が考えることができる主な違いの1つは、2番目のアプローチがパイプを介してより多くのデータを渡すことです。

ベストアンサー1

これはGNU Parallel --pipeの遅い速度によるものです。

cat bigfile |  parallel --pipe -L1000 --round-robin grep -f regexp.txt -

最大速度は約100MB/sです。

マニュアルページの例では、以下も見つけることができます。

parallel --pipepart --block 100M -a bigfile grep -f regexp.txt

パフォーマンスはほぼ同じですが、64コアシステムで最大20 GB / sに達することができます。

parallel --pipepart --block 100M -a bigfile -k grep -f regexp.txt

まったく同じ結果を与える必要がありますgrep -f regexp.txt bigfile

おすすめ記事