数日前、EMC マス ファイラー上の多数のファイルを処理するスクリプトで問題が発生しました。ここに私の作業コードがあります
unset xP_Array
declare -a xP_Array
...
export LOG=$HOME/BIN/somelogfile
export OUT=/path/to/device
...
echo "`date '+%m/%d/%y %T:'` START -- MEM" >> $LOG
echo "`date '+%m/%d/%y %T:'` Go to work directory." >> $LOG
cd ${OUT}
echo "`date '+%m/%d/%y %T:'` Fill the array." >> $LOG
for f in "$OUT"/*XML; do
xP_Array+=( "${f#$OUT/}" )
done
echo "`date '+%m/%d/%y %T:'` Get array length." >> $LOG
Plen=${#xP_Array[@]}
echo "`date '+%m/%d/%y %T:'` MEM: $Plen FILES TO PROCESS." >> $LOG
echo "`date '+%m/%d/%y %T:'` Check if zero files." >> $LOG
date_fmt='%m/%d/%y %T'
if (( Plen = 0 ))
then
printf "%($date_fmt)T: ZERO FILES\n" $(date +%s) >> $LOG
fi
echo "`date '+%m/%d/%y %T:'` Loop." >> $LOG
for i in "${xP_Array[@]}"
do
echo "`date '+%m/%d/%y %T:'` Move file to run directory." >> $LOG
mv $OUT/$i RUN/
echo "`date '+%m/%d/%y %T:'` PROCESSING "$i"." >> $LOG
[[[DATABASE LOAD DONE HERE]]]
echo "`date '+%m/%d/%y %T:'` Check DB LOAD return value." >> $LOG
EXIT=`echo $?`
case $EXIT in
0) echo "`date '+%m/%d/%y %T:'` COMPLETE." >> $LOG
mv RUN/"$i" "$ARCH"
;;
*) echo "`date '+%m/%d/%y %T:'` ERROR. "$i" MOVED TO RECON." >> $LOG
mv RUN/"$i" "$RECON"
;;
esac
done
echo "`date '+%m/%d/%y %T:'` END -- MEM" >> $LOG
それがより速く動作することができるかどうか疑問に思います。私はすでに DBA と協力して、データベースの挿入を高速化できるかどうかを確認していますが、ループ自体を高速に実行できるかどうか疑問に思っています。
ところで、すべてのecho
ステートメントはログ ファイルにリダイレクトされ、スクリプトの完了時に自分自身に電子メールで送信します。彼らはスクリプトを遅くしていますか?
このスクリプトを最適化して実行速度を上げることはできますか?