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
これは、プロセス全体をバッファリングせずに並列に実行します。