次の形式で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つの子プロセスを作成すると、$inFile
8つの行が同時に処理されます。
これはどのように達成できますか?
答え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
。