爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 18945|回复: 18

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

[复制链接]

新浪微博达人勋

发表于 2018-8-13 16:54:47 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
用NCL已经有一段时间了,它除了画图的强大功能,处理数据的能力也是很强的,下面简单总结一下它在处理数据方面的优势与不足:
优势:一、NCL内部包含上千个函数库,除了求绝对值(abs),求平均(dim_avg_n_Wrap)等简单的数学计算函数之外,还包含EOF、双线性插值等众多需要复杂程序实现的功能,而这些NCL一条命令就可以完美实现,详情参考http://www.ncl.ucar.edu/Document/Functions/list_alpha.shtml
          二、NCL自带读取很多数据类型的库,常见的netCDF,GRIB,HDF5,Ascii甚至无格式binary它都能够轻松地读取,相比FORTRAN读取数据,NCL要简便得太多,详情参考http://www.ncl.ucar.edu/Applications/list_io.shtml

不足:一、处理速度较慢。这也是高级编程语言的通病,正是因为其包含了大量函数库使得编程语法较为简洁方便,导致了在处理较大数据时运行速度的下降(Matlab、Python等也有同样的问题)
          二、不适合处理资料量过大的数据。这是我最近遇到的,也是最想讨论的一点。比如我前段时间在处理10年HDF5的卫星资料时,首先用的是NCL(因为读取十分方便),但是由于资料量很大(一天有8000多个HDF5文件),每次运行40分钟时都会出错(Segment fault),我也反复检查了程序和资料,始终没有发现问题。这里顺便说一下这不是内存不足导致的,我用的大型机,内存足够,程序里也都有delete。我尝试过改变程序的结构,最终发现这好像和运行时间有关,每次运行45分钟左右就会自动停止并报错,所以我初步结论是NCL在处理很大资料量而且运行时间过长的时候会出现一些不可预知的BUG。这里还要说明一点,前面所说的资料量并不完全等同资料的实际大小,因为我以前用NCL处理过30G的再分析资料(大概30个数据文件),一切正常,而处理数据量小于20G而数据文件很多的时候却往往会出问题(比如前面说的一天8000个文件),我猜测是systemfunc命令在处理资料数量过大和运行时间过久后会出BUG。后来我改用FORTRAN处理了,虽然读取相对麻烦,但是速度差距十分惊人:同样的工作,NCL运行需要40分钟,而FORTRAN只需6秒!!!所以我的结论是:在处理很大、数据量很多的资料时,NCL不太适合处理,因为会出现一些无法预知的错误(个人理解)
         以上是最近使用NCL处理数据的一些心得,纯属个人见解,欢迎讨论指正!
密码修改失败请联系微信: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

使用道具 举报

新浪微博达人勋

发表于 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

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2018-8-18 07:54:57 | 显示全部楼层
『_To_Live_』 发表于 2018-8-17 12:37
另外  还想请教一下   用matlab在程序编写上会不会比fortran更方便呢?因为我要处理的是nc格式数据  用fort ...

Matlab读nc是很方便的,程序编写也更简单,netcdf.open就可以打开,ncread就可以提取变量(详情参考matlab板块),但是运算量太大的话会算的比较慢,但是好处是没有ncl容易出bug。
FORTRAN读nc确实比较麻烦,需要自己装一个netcdf库,编译的时候要链接,另外读取的语句也相对复杂。
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

发表于 2018-8-13 21:14:41 | 显示全部楼层
为这样的帖子,点赞!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-8-17 08:56:10 | 显示全部楼层
总结的太好了,谢谢楼主的分享!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-8-17 12:34:55 | 显示全部楼层
刚好遇到同样的问题  ncl感觉可以读取很大的数据  但是不能进行大数据的循环和计算操作  请问你运行超过四十多分钟报错是这样的吗   fatal:NhlMalloc Failed:[errno=12]
fatal:["Callbacks.c":168]:[errno=12]
fatal:NhlMalloc Failed:[errno=12]
fatal:["Callbacks.c":168]:[errno=12]
fatal:NhlMalloc Failed:[errno=12]
fatal:[errno=12]
fatal:["Callbacks.c":162]:Invalid cblist...
fatal:NclMalloc Failed:[errno=12]
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-8-17 12:37:40 | 显示全部楼层
另外  还想请教一下   用matlab在程序编写上会不会比fortran更方便呢?因为我要处理的是nc格式数据  用fortran读取感觉好复杂
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2018-8-18 07:50:09 | 显示全部楼层
『_To_Live_』 发表于 2018-8-17 12:34
刚好遇到同样的问题  ncl感觉可以读取很大的数据  但是不能进行大数据的循环和计算操作  请问你运行超过四 ...

我的不是,你这个是由于内存不足导致的,官网上有说明http://www.ncl.ucar.edu/Document ... ges.shtml#NclMalloc
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-8-20 08:44:02 | 显示全部楼层
NCL画图很强大,处理数据也很好,但是我水平太低,fortran不仅看不懂,更不会用,我一般来说配合CDO这个工具处理数据
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-8-20 13:10:01 | 显示全部楼层
最新版的ncl6.5出并行功能了,题主可以试试并行处理,速度应该会快
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-10-16 23:29:38 | 显示全部楼层
楼主您好!我想请问您一个问题,我最近在用NCL读取txt文件时数据时遇到了一个情况,txt文件大概有一百七十万行50列,不知道算不算大,用asciiread读取文件后printVarSummary得到的数据个数和原来的txt不一致,想请问这是怎么一回事啊?有没有解决办法,先谢过楼主了。
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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