バックグラウンド
高潮をコンピューターで研究している研究機関で働いており、Bash を使用して HPC コマンドの一部を自動化しようとしています。現在、プロセスは NOAA からデータをダウンロードし、コマンド ファイルを手動で 1 行ずつ作成し、各ファイルの場所、プログラムがそのファイルからデータを読み取る時間、および風倍率を入力します。NOAA が生成する各ダウンロードには、これらのデータ ファイルが何百もあり、嵐が進行している場合、約 6 時間ごとに出力されます。これは、嵐の間の多くの時間は、これらのコマンド ファイルの作成に費やされていることを意味します。
問題
このプロセスを自動化するために使用できるツールが限られているのは、ユーザー アカウントとスーパーコンピューターでの毎月の割り当て時間を持っているだけだからです。それらに新しいソフトウェアをインストールする権限がありません。さらに、それらの一部は Cray、一部は IBM、一部は HP などです。それらの間に一貫したオペレーティング システムはありません。唯一の類似点は、それらがすべて Unix ベースであることです。そのため、Bash、Perl、awk、Python などのツールを自由に使用できますが、csh、ksh、zsh、bc などのツールは必ずしも必要ではありません。
$ bc
-bash: bc: command not found
さらに、私のリード サイエンティストは、私が彼のために書くすべてのコードを Bash で書くように要求しました。なぜなら、彼はそれを理解しているからです。たとえば、浮動小数点演算を行うことができないため、浮動小数点数を追加できる必要があります。Bash 内から Perl を呼び出すことはできますが、遅いです。
$ time perl -E 'printf("%.2f", 360.00 + 0.25)'
360.25
real 0m0.052s
user 0m0.015s
sys 0m0.015s
1/20 秒は長い時間のようには見えませんが、1 つのファイルでこの呼び出しを 100 回行う必要がある場合、1 つのファイルを処理するのに約 5 秒かかります。6 時間ごとに 1 つしか作成していない場合は、それほど悪くはありません。ただし、この作業をより大きな課題に抽象化すると、大西洋海盆に 1,000 の合成嵐を一度に向けて、嵐がより強かったり、別の経路をたどったりした場合に何が起こった可能性があるかを調べると、5 秒は急速にテキスト ファイルを処理するだけで 1 時間以上かかります。時間単位で請求される場合、これは問題を引き起こします。
質問
これをスピードアップする良い方法は何ですか? 現在for、スクリプトに次のループがあります (実行に 5 秒かかるループ):
for FORECAST in $DIRNAME; do
echo $HOURCOUNT" "$WINDMAG" "${FORECAST##*/} >> $FILENAME;
HOURCOUNT=$(echo "$HOURCOUNT $INCREMENT" | awk '{printf "%.2f", $1 + $2}');
done
データ ファイルをループする awk または Perl を 1 回呼び出すと、ディレクトリ内のファイルごとに 1 回呼び出すよりも 100 倍速くなり、これらの言語でファイルを簡単に開いて書き込むことができることはわかっていますが、データをやり取りしています。これら 3 つの言語 (awk、Perl、Python) だけで多くのリソースを見つけましたが、それらを Bash スクリプトに埋め込む方法についてはあまり見つけることができませんでした。私が到達できた最も近いものは、awkコマンドのこのシェルを作成することです:
awk -v HOURCOUNT="$HOURCOUNT" -v INCREMENT="$INCREMENT" -v WINDMAG="$WINDMAG" -v DIRNAME="$DIRNAME" -v FILENAME="$FILENAME" 'BEGIN{ for (FORECAST in DIRNAME) do
...
}'
しかし、これが正しい構文であるかどうか、また正しい場合、これが最善の方法であるかどうか、またはまったく機能するかどうかはわかりません。数日間壁に頭をぶつけていたので、接続する前にインターネットに問い合わせることにしました。