爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
12
返回列表 发新帖
楼主: Soaring

[经验总结] 小结NCL处理数据的优势与不足

[复制链接]

新浪微博达人勋

 楼主| 发表于 2018-10-17 09:05:10 | 显示全部楼层
mushroom111 发表于 2018-10-16 23:29
楼主您好!我想请问您一个问题,我最近在用NCL读取txt文件时数据时遇到了一个情况,txt文件大概有一百七十 ...

你如果读了没有报错说明读取没有问题,个数不一致有可能是txt里有一些非正常数据(例如字母,汉子等),asciiread在读取的时候碰到这些会跳过。所以建议你检查一些你的原始数据是不是规则的数字矩阵,当然也不排除你读取的操作出现人为错误。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-11-30 13:11:22 | 显示全部楼层
我觉得楼主的这个问题,应该是NCL加载了所需的数据文件,没有close机制,使用了的内存,不会自动释放(就算delete变量也不行,变量删了数据文件还是打开着的,不像fortran可以close文件),但是关闭了这个NCL脚本以后,内存就释放回来了,就可以继续往下运行。

我提供一个思路,可以试试结合shell来运行NCL脚本。
而且还有可以在shell里面设置并行运行运行(当然6.5版本的NCL已经有并行了,但是内存释放机制应该还有问题),运算速度能再快一点。

我也遇到楼主说的问题,我需要处理的数据量也非常大,而且涉及的运算过程也复杂,用fortran语言自己写一些计算函数很不实际,调用NCL的函数库更简单。但如果单纯用NCL循环运行的话,内存是完全不够的。

我尝试用shell在外部调用NCL脚本,循环和必要的参数设置在shell脚本里完成和声明(export等),NCL脚本采用getenv等函数读取shell外部的声明了的参数,就可以实现大量数据的处理,而且不出现楼主所说的错误,实测比只用NCL脚本运算快的多。

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2018-12-1 08:17:01 | 显示全部楼层
ljh110011 发表于 2018-11-30 13:11
我觉得楼主的这个问题,应该是NCL加载了所需的数据文件,没有close机制,使用了的内存,不会自动释放(就算 ...

是的,我现在也考虑用shell,用软连接的方法避免NCL里的循环读取
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-12-13 15:24:11 | 显示全部楼层
ljh110011 发表于 2018-11-30 13:11
我觉得楼主的这个问题,应该是NCL加载了所需的数据文件,没有close机制,使用了的内存,不会自动释放(就算 ...

请问shell怎么调用ncl?可以分享一下脚本吗?
我在shell里写的
echo "1"
ncl test.ncl
echo "2"
但是显示1,执行完test.ncl后,就不执行 echo "2"了
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-12-14 15:36:29 | 显示全部楼层
onnttts 发表于 2018-12-13 15:24
请问shell怎么调用ncl?可以分享一下脚本吗?
我在shell里写的
echo "1"

方法都告诉你了,你去学一些简单的shell语言命令就行啊
举个简单的栗子:
数据文件在  /home/data   里面,文件个数是20个,但是每个文件有几百万行,要用shell外部循环调用ncl计算每个文件第一列数据的标准差,那么:
-----------------------------------------------------------------------------------
shell脚本:
export datadirectory='/home/data'         #文件路径
declare -i numOFfile=20          #文件总数,用shell里面定义整型的来定义
#开始循环,for循环,while循环很多都可以用
for ((i=0;i<$numOFfile;i=i+1))
do
    export fileNO=${i}      #循环一次更新声明一次文件编号,方便NCL里面的getenv函数读取
    ncl test.ncl
done
-----------------------------------------------------------------------------------
NCL脚本:
begin
    filedirectory = getenv("datadirectory")  ;调用文件目录
    fs = systemfunc("ls "+filedirectory+"/*")   ;列出文件
    i = stringtoint(getenv("fileNO"))    ;读文件号,转成整型
    ;读文件内容
    ele = readAsciiTable(fs(i),numAsciiCol(fs(i)),"float",0)
    ;求第一列的标准差
    stdvOFele0 = stddev(ele(:,0))
    ;输出标准差到屏幕
    print(stdvOFele0)
end
-----------------------------------------------------------------------------------

没有运行过不保证能不能运行,但是思路大概是这样。你自己看一下相关的shell语言的规则就能明白了,后面就不会再回复了,现在工作繁忙,时间很少,见谅。
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

发表于 2019-1-21 21:39:52 | 显示全部楼层
点赞!




密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2019-5-8 23:51:12 | 显示全部楼层
大神们,我想问下如何用ncl截取不连续时间段的日数据呢,比如将第5到10天的最低温和第15到20天的最低温截取出来,并将这两段时间数据整合到新的nc文件
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2019-5-9 08:06:36 | 显示全部楼层
smile_diaodiao 发表于 2019-5-8 23:51
大神们,我想问下如何用ncl截取不连续时间段的日数据呢,比如将第5到10天的最低温和第15到20天的最低温截取 ...

怎么截取数据是在程序里设置判断和循环,写入新的nc文件参考官网:http://www.ncl.ucar.edu/Applications/write_netcdf.shtml
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

发表于 2019-8-22 15:11:41 | 显示全部楼层
打破砂锅纹到底 发表于 2018-8-20 13:10
最新版的ncl6.5出并行功能了,题主可以试试并行处理,速度应该会快

你好请问这个并行功能在哪里看呢
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表