Bashスクリプトのマルチスレッド/ポーキング

Bashスクリプトのマルチスレッド/ポーキング

次の形式でbashスクリプトを作成しました。

#!/bin/bash
start=$(date +%s)
inFile="input.txt"
outFile="output.csv"

rm -f $inFile $outFile

while read line
do

    -- Block of Commands

done < "$inFile"

end=$(date +%s)

runtime=$((end-start))

echo "Program has finished execution in $runtime seconds."

ループwhileはから読み込み$inFile、その行でいくつかのアクティビティを実行し、結果をにダンプします$outFile

$inFileスクリプトは3500行を超えるため、フル実行には6〜7時間かかります。この時間を最小限に抑えるために、このスクリプトはマルチスレッドまたはフォークを使用する予定です。 8つの子プロセスを作成すると、$inFile8つの行が同時に処理されます。

これはどのように達成できますか?

ベストアンサー1

牛に似た一種の栄養parallelこの種の仕事のために設計されています。一度に複数回スクリプトを実行し、各スクリプトに入力とは異なるデータを提供できます。

cat input.txt | parallel --pipe your-script.sh

デフォルトでは、システム内のプロセッサの数に応じてプロセスを作成しますが-j N

特に、きちんとしたトリックの1つは、shebang-wrapping機能です。 Bashスクリプトの最初の行を次のように変更した場合:

#!/usr/bin/parallel --shebang-wrap --pipe /bin/bash

標準入力を介してデータを供給すると、すべてが自動的に発生します。これは、最後に実行する必要があるクリーンアップコードがある場合(実行できます)、あまり役に立ちません。

いくつかの注意点があります。 1つは、入力を隣接するチャンクに分割し、一度に1つずつチャンクを使用することです。行をインターリーブしません。別の方法は、レコード数に関係なくチャンクがサイズ別に分割されることです。これを使用して--block Nさまざまなブロックサイズ(バイト)を設定できます。あなたの場合、ファイルサイズの1/8以下が正確でなければなりません。ファイルが 1 つの塊で終わるほど小さい場合もあれば、目的を失うこともあります。

特定のユースケースにはさまざまなオプションがありますが、地図時間内容がとてもよく入っています。興味のあるオプションには、--round-robinおよびが含まれます--group

おすすめ記事