異なるフォーマットの3種類のデータがあります。データ型ごとに、それを単一の統一フォーマットに変換するPythonスクリプトがあります。
このPythonスクリプトは遅く、CPUにバインドされている(マルチコアマシンのシングルコアに)ため、スクリプトの3つのインスタンスを実行し(データタイプごとに1つ)、それらの出力を組み合わせてに渡しsort
ます。基本的に、これと同等です:
{ ./handle_1.py; ./handle_2.py; ./handle_3.py } | sort -n
しかし、3つのスクリプトが並行して実行されます。
ストリームを処理するスクリプトのn個のインスタンス間で、いくつかのstdoutストリームをラウンドロビンするためにGNU が使用されているこの質問を見つけましたsplit
。
分割されたmanページから:
-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
これは煩わしいです-上で貼り付けたmanページの抜粋に基づいて、行の整合性を維持する必要があります。
明らかに、-u
引数を削除すると機能しますが、バッファリングされ、1つを除いてすべてのスクリプトの出力をバッファリングするため、メモリが不足します。
誰かがここで何らかの洞察を持っている場合、それは非常に高く評価されるでしょう。私はここで私の深さを超えています。
job1.py > file1 & job2.py > file 2 & job3.py > file3 ; wait ; sort -n file1 file2 file3
か?
coproc
組み込みのbash を確認するように指示されましたが、どのように適用されるかはわかりません。