並列プロセスの実行を待って出力を一緒に接続するには?

並列プロセスの実行を待って出力を一緒に接続するには?

Unixで作業するのは初めてで、次の順序で実行するスクリプトを作成したいと思います。

  • デフォルトの.tsvファイルをインポートしてXファイルに分割します。各ファイルにはY行が含まれています。
  • プログラムで各分割ファイルを実行し、完了すると新しい.tsvファイルを出力します。
  • すべての分割ファイルの処理が完了するのを待ってから、出力ファイルを1つにリンクします。

split私はandを使ってファイルを分割する方法を知っていますsedが、パーティションファイルをPythonスクリプトで実行するのも難しいとは思いませんが、問題は並列プログラムのすべての実行がいつ完了したかを確認してからステッチすることです。それらの出力を1つにします。

私が知る限り、split名前は自動的に増加し、それを大規模に並列化できます。このSOの質問に見られるようにだから、その部分を見つけることができます。並列Pythonスクリプトセットの実行状態を確認する方法はありますか?私がしたいことをどのように達成できますか?

答え1

split -l $Y main.tsv main_part_
for part in main_part_*; do
    program $part &
done
wait
echo "all done"

waitbash 組み込み機能です。詳しくはマニュアルページをご覧ください。

答え2

Gilesがすでにコメントで指摘したように。GNUパラレル分割セグメントの再結合順序を分割して維持する機能が組み込まれているため、この作業に最適です。通常は行ごとに分割されますが、特定のレコードの開始と終了を指定し、すべての分割操作に対してヘッダーを繰り返すように命令できます(タブ区切り値ファイルの場合は列ヘッダーにすることができ、.tsvより簡単です)。ために書いてみます。)私はこれを使用しました並列実行xz

ハンドラが標準入力から入力を取得し、標準出力に出力を書き込むフィルタである場合、これは最も簡単です。以下は、Pythonプログラムが呼び出されると仮定します。xyz

基本通貨は

cat input.tsv | parallel --pipe -k xyz > output.tsv

この--pipeオプションを使用すると、並列処理は入力をデータとして解釈し、呼び出しのためにプログラムに送信され(異なるモードがあり)、-k出力順序を維持します。

マニュアルセクション--pipe詳細ブロックサイズ、履歴の開始と終了(デフォルトでは冗長ですが非表示にすることができます)、および冗長ヘッダー。

プログラムにコマンドラインオプションが必要な場合は、xyz出力リダイレクトの前にコマンドラインでそのオプションを指定できます(> ..)。


--pipepart最新バージョンがある場合(いずれにせよ)、入力がファイル(ナビゲーションなど)であると想定し、レコード数と行数を使用しないより効率的なオプションを使用できます。

 parallel -a input.tsv --pipepart -k xyz > output.tsv

関連情報