GNUパラレルm個の正規表現を見つけるためにn行をgrepします例示的なガイドラインは次のとおりです。
CPUが制限要素の場合は、正規表現を並列化する必要があります。
cat regexp.txt | parallel --pipe -L1000 --round-robin grep -f - bigfile
これにより、CPUごとに1つのgrepが実行され、CPUごとに1回ずつ大きなファイルが読み取られます。ただし、これは並行して実行されるため、最初の読み取り以外のすべての読み取りはRAMにキャッシュされます。
したがって、この例では、GNUはparallel
grepの並列インスタンスから正規表現を丸め、それぞれ個別に読み込みます。上記のドキュメントに示されているように、ディスクキャッシュを使用すると、ディスクから一度だけ読み取ることができます。regex.txt
grep
bigfile
bigfile
parallel
私の質問はこれです。上記のアプローチは、読み取りの各並列インスタンスからGNUループレコードを取得することに関連する他のアプローチよりもパフォーマンスの面で優れていると考えられているようです。bigfile
grep
regexp.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