まず最初に、ループを関数にラップしてからフォークします。これは、プロセスを分割する場合に実行されます。たとえば、160,000行以上のCSVを処理している場合、単一のプロセス/「スレッド」には数時間かかります。ループを関数にラップして単純にフォークすると、x個のプロセスが実行され、待機/強制終了プロセスループが追加されて完了です。ここであなたが見ているもの。
ネストされたループを持つwhileループ:
function jobA() {
while read STR;
do
touch $1_temp
key=$(IFS="|";set -- $STR; echo $1)
for each in ${blah[@]};
do
#echo "$each"
done
done <$1;
}
for i in ${blah[@]};
do
echo "$i"
$(jobRDtemp $i) &
child_pid=$!
parent_pid=$$
PIDS+=($child_pid)
echo "forked process $child_pid with parent $parent_pid"
done
for pid in ${PIDS[@]};
do
wait $pid
done
echo "all jobs done"
sleep 1
これでラップされました。これがFORKEDループの例です。これは、並列プロセスがバックグラウンドで実行されることを意味します。WAITは、続行する前にALLが完了するのを待ちます。これは、一部のタイプのスクリプトにとって重要です。
また、上記のようにCスタイルで記述されたネストされたFORループを使用しないでください。例:
for (( i = 1; i <= 5; i++ )) ### Outer for loop ###
これは非常に遅いです。このタイプを使用してください:
for each in ${blah[@]};
do
#echo "$each"
if [ "$key" = "$each" ]; then
# echo "less than $keyValNeed..."
echo $STR >> $1_temp
fi
done