小编Jon*_*rum的帖子

在Bash中有效地计算浮点运算数十万次

背景

我在一家研究风暴潮的研究机构工作,并尝试使用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 shell performance hpc supercomputers

6
推荐指数
1
解决办法
306
查看次数

为什么要创建jQuery对象变量?

我看到很多jQuery示例都做了类似的事情

var $element = $('#element');
$element.foo...
Run Code Online (Sandbox Code Playgroud)

而不仅仅是打字

$('#element').foo...
Run Code Online (Sandbox Code Playgroud)

我确实知道如果你正在使用$ element那么节省了一点点的输入,但那些$ element只调用一次或两次的时间呢?为什么有些开发人员在这些实例中将其声明为jQuery对象变量?浏览器处理它也更有效吗?

javascript jquery

3
推荐指数
1
解决办法
1455
查看次数

如何在我的机器上同时安装多个版本的Java JDK?

背景

我的工作主要是Java和Scala,但是我们的许多遗留代码还没有更新到最新的JDK.因此,我们必须在我们的开发机器上安装JDK版本5,6,7和8.直到最近,我一直在使用Arch Linux,但我刚刚切换到OpenSuse Tumbleweed.我用来安装JDK版本的方法是从Oracle网站下载RPM安装程序脚本,然后从1.5开始安装它们,然后以1.8的方式工作,这样/usr/java/latest符号链接就已经指向了正确的版本.

问题

重新安装上述JDK版本后,我尝试在IntelliJ IDEA中指向这些安装.但它抱怨错误" 所选目录不是JDK的有效主页 ".我在网上找到了很多关于这个问题和类似问题的资源,但这些解决方案都没有对我的情况有所帮助.此外,/usr/bin各种Java可执行文件的符号链接指向/etc/alternatives指令的大火.

java linux rpm

3
推荐指数
1
解决办法
2万
查看次数

在Python中从文件名中提取子字符串?

我有一个充满文件的目录,这些文件的文件名包含日期字符串:

file_type_1_20140722_foo.txt
file_type_two_20140723_bar.txt
filetypethree20140724qux.txt
Run Code Online (Sandbox Code Playgroud)

我需要从文件名中获取这些日期字符串并将它们保存在数组中:

['20140722', '20140723', '20140724']
Run Code Online (Sandbox Code Playgroud)

但它们可以出现在文件名中的各个位置,因此我不能只使用子字符串表示法并直接提取它。过去,我在 Bash 中做类似事情的方式是这样的:

date=$(echo $file | egrep -o '[[:digit:]]{8}' | head -n1)
Run Code Online (Sandbox Code Playgroud)

我不能使用 Bash 来实现这个目的,因为它在数学上很糟糕(我需要能够对浮点数进行加法和减法)。我尝试过glob.glob()re.match(),但都返回空集:

>>> dates = [file for file in sorted(os.listdir('.')) if re.match("[0-9]{8}", file)]
>>> print dates
>>> []
Run Code Online (Sandbox Code Playgroud)

我知道问题是它正在寻找八位数字长的完整文件名,但我不知道如何让它寻找子字符串。有任何想法吗?

python regex

1
推荐指数
1
解决办法
1万
查看次数

标签 统计

bash ×1

hpc ×1

java ×1

javascript ×1

jquery ×1

linux ×1

performance ×1

python ×1

regex ×1

rpm ×1

shell ×1

supercomputers ×1