並列に生成された3つの異なるストリームから単一の出力ストリームを作成する

並列に生成された3つの異なるストリームから単一の出力ストリームを作成する

3種類のデータがあります。各データ型には、それを単一の統合形式に変換するPythonスクリプトがあります。

このPythonスクリプトは遅くてCPUにバインドされているので(マルチコアシステムの単一コアに対して)3つのインスタンス(各データ型ごとに1つ)を実行し、出力を結合しますsort。これは次のとおりです。

{ ./handle_1.py; ./handle_2.py; ./handle_3.py } | sort -n

ただし、3 つのスクリプトは並列に実行されます。

私が見つけたこの問題ここで、GNU は、splitストリームを処理するスクリプトの n インスタンス間で標準出力ストリームを繰り返すために使用されます。

分割マニュアルページから:

-n, --number=CHUNKS
          generate CHUNKS output files.  See below
CHUNKS  may be:
 N       split into N files based on size of input
 K/N     output Kth of N to stdout
 l/N     split into N files without splitting lines
 l/K/N   output Kth of N to stdout without splitting lines
 r/N     like 'l'  but  use  round  robin  distributio

したがって、r/Nコマンドは「区切り線なし」。

これに基づいて、次の解決策が可能になるようです。

split -n r/3 -u --filter="./choose_script" << EOF
> 1
> 2
> 3
> EOF

ここでこの場所はchoose_script

#!/bin/bash
{ read x; ./handle_$x.py; }

残念ながら、そこにはいけない多くの改行文字だけでなく、いくつかの行が混在していることがわかります。

たとえば、Pythonスクリプトを次のような単純なbashスクリプトに置き換える場合:

#!/bin/bash
# ./handle_1.sh
while true; echo "1-$RANDOM"; done;

#!/bin/bash
# ./handle_2.sh
while true; echo "2-$RANDOM"; done;

#!/bin/bash
# ./handle_3.sh
while true; echo "3-$RANDOM"; done;

次の出力が表示されます。

1-8394

2-11238
2-22757
1-723
2-6669
3-3690
2-892
2-312511-24152
2-9317
3-5981

これは迷惑なことです。上に貼り付けたマニュアルページによると、ラインの整合性を維持する必要があります。

明らかに、パラメータを削除すると-u機能しますが、バッファリングが発生し、スクリプトの1つを除くすべての出力をバッファリングするため、メモリが不足します。

誰でもここに洞察力があれば大変感謝します。私は深さを超えています。

ベストアンサー1

GNU並列処理の-uオプションを試してください。

echo "1\n2\n3" | parallel -u -IX ./handle_X.sh

これは、プロセス全体をバッファリングせずに並列に実行します。

おすすめ記事