--pipe
は( - 何かがあなたのシステムに非常に間違っていない、あなたが測定されているスケールでいえ)非効率的です。 1 GB /秒(合計)のオーダで配信できます。
--pipepart
は、逆に、非常に効率的です。ディスクが十分に高速であれば、コアあたり1 GB /秒のオーダで配信できます。これは、処理の最も効率的な方法であるはずですdata.txt1
。これは、CPUコアごとに1つのブロックにしてdata.txt1
を分割し、各コア上で実行されているwc -l
にこれらのブロックを供給します:
parallel --block -1 --pipepart -a data.txt1 wc -l
block -1
が機能するためにあなたがバージョン20161222以降が必要です。
これらは私の古いデュアルコアのノートパソコンからのタイミングです。seq 200000000
は1.8GBのデータを生成します。
$ time seq 200000000 | LANG=C wc -c
1888888898
real 0m7.072s
user 0m3.612s
sys 0m2.444s
$ time seq 200000000 | parallel --pipe LANG=C wc -c | awk '{s+=$1} END {print s}'
1888888898
real 1m28.101s
user 0m25.892s
sys 0m40.672s
ここでの時間は各1メガバイトのブロックのための新しいwc -c
を産卵パラレルGNUのほとんどが原因です。ブロックサイズを大きくすると、より速くそれを作る:
$ seq 200000000 > data.txt1
$ time parallel --block -1 --pipepart -a data.txt1 LANG=C wc -c | awk '{s+=$1} END {print s}'
1888888898
real 0m2.242s
user 0m0.424s
sys 0m2.880s
だから私の古いラップトップ上で、私は2.2秒に1.8ギガバイトを処理することができます。
$ time seq 200000000 | parallel --block 10m --pipe LANG=C wc -c | awk '{s+=$1} END {print s}'
1888888898
real 0m26.269s
user 0m8.988s
sys 0m11.920s
$ time seq 200000000 | parallel --block 30m --pipe LANG=C wc -c | awk '{s+=$1} END {print s}'
1888888898
real 0m21.628s
user 0m7.636s
sys 0m9.516s
としては、ファイル内のデータを持っている場合--pipepart
がはるかに高速で述べました。
コアが1つしかなく、作業がCPUに依存する場合、並列化は役に立ちません。単一のコアマシン上で並列化することは、大部分の時間が待機(例えば、ネットワークを待っている)に費やされる場合には意味をなさえることができる。
しかし、コンピュータからのタイミングによって、何かが間違っていることがわかります。あなたのプログラムを別のコンピュータでテストすることをお勧めします。
私たちにアクセス権を与えることができるdata.txt1を使用するように例を変更することはできますか?あなたのタイミングは非常に極端なので、実行しているマシンについてさらに知る必要があります。 –
@OleTange - 要求されたとおり、私はファイルデータのロジックを添付しました。このコマンドを開発したのはあなたですか? –
私は著者です。お使いのコンピュータと別のコンピュータで以下に示すテストを試してください。私はあなたのコンピュータが何らかの形で壊れていると思います。 –