Jon*_*rum 6 bash shell performance hpc supercomputers
我在一家研究风暴潮的研究机构工作,并尝试使用Bash自动化一些HPC命令.目前,我们的过程是从NOAA下载数据并逐行手动创建命令文件,输入每个文件的位置以及程序从该文件读取数据的时间和风放大系数.NOAA生成的每个下载中都有数百个这样的数据文件,当风暴正在进行时,每6个小时左右就会出现一次.这意味着我们在风暴期间的大部分时间都花在制作这些命令文件上.
我可以用来自动化这个过程的工具受到限制,因为我只是拥有一个用户帐户和每月在超级计算机上分配的时间; 我没有权限在他们身上安装新软件.另外,其中一些是Crays,一些是IBM,一些是HP,等等.它们之间没有一致的操作系统; 唯一的相似之处是它们都是基于Unix的.所以我拥有像Bash,Perl,awk和Python这样的工具,但不一定是像csh,ksh,zsh,bc等工具:
$ bc
-bash: bc: command not found
Run Code Online (Sandbox Code Playgroud)
此外,我的首席科学家已经要求我为他写的所有代码都是Bash,因为他理解它,只需要很少调用外部程序来完成Bash无法做到的事情.例如,它不能做浮点运算,我需要能够添加浮点数.我可以在Bash中调用Perl,但这很慢:
$ time perl -E 'printf("%.2f", 360.00 + 0.25)'
360.25
real 0m0.052s
user 0m0.015s
sys 0m0.015s
Run Code Online (Sandbox Code Playgroud)
1/20秒似乎不是很长时间,但是当我必须在单个文件中进行100次此调用时,相当于处理一个文件大约需要5秒钟.当我们每6小时制作其中一个时,情况就不那么糟了.然而,如果这项工作被抽象为一项更大的任务,我们一次在大西洋盆地指出1,000次合成风暴,以便研究风暴强大或采取不同路径可能发生的事情,5秒迅速增长到只需要一个多小时来处理文本文件.按小时计费时,这会产生问题.
加快这个速度的好方法是什么?我目前for在脚本中有这个循环(需要5秒才能运行的循环):
for FORECAST in $DIRNAME; do
echo $HOURCOUNT" "$WINDMAG" "${FORECAST##*/} >> $FILENAME;
HOURCOUNT=$(echo "$HOURCOUNT $INCREMENT" | awk '{printf "%.2f", $1 + $2}');
done
Run Code Online (Sandbox Code Playgroud)
我知道单个调用awk或Perl来循环遍历数据文件比调用目录中的每个文件一次快一百倍,并且这些语言可以轻松打开文件并写入它,但问题是我我正在来回收集数据.我已经在这三种语言中找到了很多资源(awk,Perl,Python),但是在将它们嵌入到Bash脚本中时却找不到多少资源.我能够得到的最接近的是使这个awk命令的shell:
awk -v HOURCOUNT="$HOURCOUNT" -v INCREMENT="$INCREMENT" -v WINDMAG="$WINDMAG" -v DIRNAME="$DIRNAME" -v FILENAME="$FILENAME" 'BEGIN{ for (FORECAST in DIRNAME) do
...
}'
Run Code Online (Sandbox Code Playgroud)
但我不确定这是正确的语法,如果是,如果它是最好的方法,或者它甚至可以工作.我已经在墙上撞了几天了,决定在插上电话之前先上网.
Bash 的能力很强,只要你有你需要的能力。对于浮点,您基本上有两个选择,要么bc(至少在您显示的盒子上没有安装[这有点难以置信])或calc。计算-2.12.4.13.tar.bz2
这两个包都是灵活且功能强大的浮点程序,可以与 bash 很好地集成。由于当权者偏爱 bash,我会研究安装bc或calc。(工作有保障是好事)
如果可以说服你的上级允许 或perl,python那么两者都可以。如果您从未在其中任何一个中编程过,那么两者都会有一个学习曲线,python比perl. 如果你的上级可以阅读bash,那么翻译perl对他们来说会比翻译更容易理解python。
这是您在解释时给出的选项的合理概述。无论您如何选择,使用任何一种语言,您的任务都不应该那么艰巨。当你遇到困难时,只需回话即可。