はい

はい

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

foo@bar:~$ A |B

これで1つのコアしか消費しないことがわかったので、次の質問があります。

プログラムAとBは同じコンピューティングリソースを共有していますか?可能であれば、AとBを同時に実行する方法はありますか?

私が気づいたもう一つのことは、AがBよりはるかに速く実行されることです。したがって、Bプログラムをさらに実行し、Aの出力ラインを並列に処理できるかどうか疑問に思います。

つまり、Aはその行を印刷し、その行を読み取るプログラムBのNインスタンス(誰が最初に読んでも関係なく)を処理し、stdoutとして印刷します。

だから私の最後の質問は次のとおりです。

競合状態やその他の不一致の可能性を心配することなく、複数のBプロセス内で出力をAにパイプする方法はありますか?

ベストアンサー1

1つの問題split --filterは、出力が混在する可能性があるため、プロセス1で半分のラインを取得し、次にプロセス2で半分のラインを取得することです。

GNU Parallelは混乱を保証しません。

だからあなたがしたいと仮定しましょう:

 A | B | C

しかし、Bは非常に遅いので、並列化しようとしています。これにより、次のことができます。

A | parallel --pipe B | C

GNUパラレルは、デフォルトでブロックサイズが1MBの\ nに分割されます。 --recend と --block を使って調整できます。

GNU Parallelの詳細については、以下で確認できます。http://www.gnu.org/s/parallel/

わずか10秒でGNU Parallelをインストールできます。

$ (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 883c667e01eed62f975ad28b6d50e22a
12345678 883c667e 01eed62f 975ad28b 6d50e22a
$ md5sum install.sh | grep cc21b4c943fd03e93ae1ae49e28573c0
cc21b4c9 43fd03e9 3ae1ae49 e28573c0
$ sha512sum install.sh | grep da012ec113b49a54e705f86d51e784ebced224fdf
79945d9d 250b42a4 2067bb00 99da012e c113b49a 54e705f8 6d51e784 ebced224
fdff3f52 ca588d64 e75f6033 61bd543f d631f592 2f87ceb2 ab034149 6df84a35
$ bash install.sh

紹介ビデオを見るhttp://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

おすすめ記事