GNU/Linux >> Linux の 問題 >  >> Linux

パイプコマンドを並行して実行しますか?

次のシナリオを考えてみましょう。 2つのプログラムAとBがあります。プログラムAは文字列のstdout行に出力し、プログラムBはstdinからの行を処理します。もちろん、これら2つのプログラムの使用方法は次のとおりです。

[メール保護]:〜$ A | B

これでコアが1つしか消費されないことに気づきました。したがって、私は疑問に思っています:

プログラムAとBは同じ計算リソースを共有していますか?もしそうなら、AとBを同時に実行する方法はありますか?

私が気付いたもう1つの点は、AがBよりもはるかに高速に実行されることです。したがって、どういうわけか、より多くのBプログラムを実行して、Aが出力する行を並列に処理させることができるかどうか疑問に思っています。

つまり、Aはその行を出力し、これらの行を読み取る(最初に読み取る人)プログラムBのインスタンスがN個あり、それらを処理してstdoutに出力します。

だから私の最後の質問は:

競合状態やその他の潜在的に発生する可能性のある不整合を処理することなく、いくつかのBプロセス間で出力をAにパイプする方法はありますか?

承認された回答:

split --filterの問題 出力が混同される可能性があるため、プロセス1から半分の行を取得し、次にプロセス2から半分の行を取得します。

GNU Parallelは、取り違えがないことを保証します。

だからあなたがやりたいと仮定してください:

 A | B | C

しかし、そのBはひどく遅いので、それを並列化する必要があります。次に、次のことができます:

A | parallel --pipe B | C

GNU Parallelは、デフォルトで\nおよび1MBのブロックサイズで分割されます。これは、–recendおよび–blockで調整できます。

GNU Parallelの詳細については、http://www.gnu.org/s/parallel/

を参照してください。

以下を使用すると、わずか10秒でGNUParallelをインストールできます。

$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
   fetch -o - http://pi.dk/3 ) > install.sh
$ sha1sum install.sh | grep 67bd7bc7dc20aff99eb8f1266574dadb
12345678 67bd7bc7 dc20aff9 9eb8f126 6574dadb
$ md5sum install.sh | grep b7a15cdbb07fb6e11b0338577bc1780f
b7a15cdb b07fb6e1 1b033857 7bc1780f
$ sha512sum install.sh | grep 186000b62b66969d7506ca4f885e0c80e02a22444
6f25960b d4b90cf6 ba5b76de c1acdf39 f3d24249 72930394 a4164351 93a7668d
21ff9839 6f920be5 186000b6 2b66969d 7506ca4f 885e0c80 e02a2244 40e8a43f
$ bash install.sh

http://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

の紹介ビデオをご覧ください
Linux
  1. 5Linuxネットワークのトラブルシューティングコマンド

  2. 私のお気に入りの8つの実用的なLinuxコマンド

  3. IPtablesコマンドのチートシート

  1. どのBashが実行されていますか?

  2. Linuxの検索コマンド

  3. Linuxエコーコマンド

  1. Linux コマンド ラインの基本 – コマンド ラインからのコマンドの実行

  2. Bash:chroot 内からコマンドを実行してユーザーを切り替える

  3. 限られた数のコマンドを並行して処理する Bash スクリプト