爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 16382|回复: 8

[其他] 【更新:已解决】cygwin调用NCL 报错:fatal:NclMalloc Failed:[errno=12]

[复制链接]

新浪微博达人勋

发表于 2015-8-22 11:07:43 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 lzc90 于 2015-8-22 18:42 编辑

    因项目开发需要,必须在Windows系统下,使用CFSv2预报资料(.grb2格式)。因IDL8.3版本读取grb2数据有错,故采用cygwin调用NCL的方式,利用NCL将GRB2格式转换为NC格式,再利用IDL处理NC文件。但是在读取数据量较大文件海表下5m温度文件ocnsst.grb2([lon,lat,tine]维数大小:[720,360,1196],170余M)出现错误如下:
  1. ncl ocnsst.ncl

  2. Processing file: ocnsst.grb2...

  3. Copyright (C) 1995-2011 - All Rights Reserved
  4. University Corporation for Atmospheric Research
  5. NCAR Command Language Version 6.0.0

  6. The use of this software is governed by a License Agreement.

  7. See http://www.ncl.ucar.edu/ for more details.

  8. <font color="Magenta"><b>fatal:NclMalloc Failed:[errno=12]

  9. Segmentation fault (core dumped)
  10. </b></font>
复制代码
如果在不替代现有海温资料.grb2的前提下,可以如何解决?暂思考无果,烦劳各位提出宝贵意见和建议。
   我的文本ocnsst.ncl代码附于文末可能导致该错误的语句(读入数组过大),为第 24 行 和 第60 行。)。


  1. <P>
  2. <P>load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl"
  3. function rdVar4D (f:file, vName:string, time:integer, lat:float,lon:float)
  4. ; read GRIB 4D variable and assign new dimension names

  5. begin
  6.   
  7.     var=new((/dimsizes(time),dimsizes(lat),dimsizes(lon)/),float)
  8.   
  9.     var_TMP = f->$vName$; read variable
  10.   
  11.     var_TMP!0 = "time"     ; assign 'conventional' dimension names
  12.   
  13.     var_TMP!1 = "lat"
  14.     var_TMP!2 = "lon"   
  15.   
  16.     var!0 = "time"     ; assign 'conventional' dimension names

  17.     var!1 = "lat"  
  18.   
  19.     var!2 = "lon"  
  20.   
  21.    var=var_TMP(:(dimsizes(time)-1),59:220,89:560)

  22.     return(var)                                                            

  23. end   



  24. begin  

  25. ;***********************************************

  26. ; read in data from GRIB file
  27. ;***********************************************
  28.    
  29.    gribdir  = "./"
  30.    
  31.   gribfil  = "ocnsst.grb2"
  32.    
  33.   grib_in  = addfile(gribdir+gribfil, "r")

  34.      _ft=grib_in->forecast_time0
  35.    
  36.    _lat=grib_in->lat_0
  37.     _lon=grib_in->lon_0
  38.    time=_ft(:239)

  39.      time!0 = "time"
  40.   
  41.    lat=_lat(59:220) ;_lat[59]=60.25,_lat[220]=-20.25    Origin:  _lat range=[89.75,-89.75] Delta=0.5 N=360
  42.    lat!0 = "lat"
  43.    
  44.    lon=_lon(89:560) ;_lon[89]=44.75,_lon[560]=280.25    Origin:  _lon range=[0.25,359.75] Delta=0.5 N=720
  45.    lon!0 = "lon"                             
  46.    
  47.    
  48. ocnsst= rdVar4D (grib_in, "POT_P0_L160_GLL0" ,time,lat,lon)</STRONG> ;240个6小时,代表预报未来60天</P>
  49. <P>;***********************************************
  50. ; create parameters and output file

  51. ;***********************************************
  52.    
  53.    ntim  = dimsizes(time)                                                            
  54.    
  55.    nlat  = dimsizes(lat)
  56.                                                   
  57.     mlon  = dimsizes(lon)
  58.      system("'rm' -f ocnsst_ncl.nc")     ; remove pre-exit file (if any)
  59.    
  60.     ncdf  = addfile("ocnsst_ncl.nc","c")  ; create output file

  61. ;***************************************************

  62. ; define file options [Version a033]

  63. ;***********************************************

  64.       setfileoption(ncdf, "prefill", False)
  65.    
  66.     setfileoption(ncdf, "suppressclose", True)

  67.      setfileoption(ncdf, "definemode", True)

  68. ;***********************************************

  69. ; assign file attributes

  70. ;***********************************************
  71.                         
  72.     fAtt               = True
  73.                            
  74.     fAtt@title         = "GRIB-to-netCDF: Efficient Approach"                          
  75.    
  76.      fAtt@source_file   = "./ocnsst.grb2"
  77.      fAtt@Conventions   = "None"                                                        
  78.    
  79.      fAtt@creation_date = systemfunc("date")
  80.      
  81.     fileattdef( ncdf, fAtt )
  82.            
  83. ;***********************************************

  84. ; predefine coordinate information
  85.                
  86. ;***********************************************
  87.     dimNames = (/"time", "lat", "lon"/)                        
  88.    
  89.     dimSizes = (/ntim ,  nlat,  mlon/)                        
  90.    
  91.     dimUnlim = (/ True , False, False/)
  92.                            
  93.     filedimdef(ncdf, dimNames  , dimSizes,  dimUnlim )
  94.                      
  95.     filevardef(ncdf, "time"  , typeof(time), getvardims(time) )
  96.      filevarattdef(ncdf, "time", time)
  97.      filevardef(ncdf, "lat", typeof(lat), getvardims(lat) )

  98.         filevarattdef(ncdf, "lat", lat)
  99.    
  100.     filevardef(ncdf, "lon", typeof(lon), getvardims(lon) )
  101.    
  102.     filevarattdef(ncdf, "lon", lon)
  103.      
  104. ;***********************************************

  105. ; predefine variable sizes

  106. ;***********************************************
  107.      filevardef(ncdf,"ocnsst",typeof(ocnsst),getvardims(ocnsst) )
  108.      filevarattdef(ncdf,"ocnsst",ocnsst)

  109. ;***********************************************

  110. ; terminate define mode: not necessary but for clarity

  111. ;***********************************************
  112.    
  113.     setfileoption(ncdf, "definemode", False)
  114. ;***********************************************

  115. ; write data values to predefined locations

  116. ; (/ .../) operator transfer values only                     

  117. ;***********************************************

  118.         ncdf->time   = (/ time /)
  119.                                                      
  120.     ncdf->lat    = (/ lat /)
  121.                                                 
  122.     ncdf->lon    = (/ lon /)
  123.                                                 
  124.     ncdf->ocnsst      = (/ ocnsst /)                                             
  125. end             </P></P>
复制代码



cygwin调NCL读取ocnsst.grb2

cygwin调NCL读取ocnsst.grb2
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-8-22 16:58:34 | 显示全部楼层
1、(/720,360,1196/)大小的数组,按float类型算,肯定不止170M,你说的应该是文件大小,内存中应该在1GB以上;
2、rdVar4D中定义var完全没有必要,内存就是这样浪费的,var_TMP = f->$vName$(:(dimsizes(time)-1),59:220,89:560)就行,并且建议直接采用坐标方式({...})抽取数据,而不是下标方式;
3、是pre-exist,非pre-exit;
4、如果这种格式转换不是频繁进行,也可以考虑找一台linux机器,把nc文件做好了在idl中直接使用。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2015-8-22 18:41:05 | 显示全部楼层
longlivehj 发表于 2015-8-22 16:58
1、(/720,360,1196/)大小的数组,按float类型算,肯定不止170M,你说的应该是文件大小,内存中应该在1GB以 ...

问题已解决,。按照您说的第二条,内存确实是浪费的,这会儿直接采用的是 var_TMP = f->$vName$(:(dimsizes(time)-1),59:220,89:560)方式,就顺利通过了。至于直接采用坐标方式,我待会儿直接问下源博,多谢!长久的心病啊!  Wzy大神让我在Windows平台下做,所以就不能用Linux,哎~不管怎样,已经解决。多谢!  
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-2-27 11:23:26 | 显示全部楼层
请教楼主是否知道在cygwin下调用ncl跑例子遇到下图错误是怎么回事
报错.jpg
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-7-14 11:01:48 | 显示全部楼层
hongfei0403 发表于 2016-2-27 11:23
请教楼主是否知道在cygwin下调用ncl跑例子遇到下图错误是怎么回事

我也想知道这个是怎么了。。。求解答
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-7-14 11:01:52 | 显示全部楼层
hongfei0403 发表于 2016-2-27 11:23
请教楼主是否知道在cygwin下调用ncl跑例子遇到下图错误是怎么回事

我也想知道这个是怎么了。。。求解答
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-3-12 16:54:11 | 显示全部楼层
hongfei0403 发表于 2016-2-27 11:23
请教楼主是否知道在cygwin下调用ncl跑例子遇到下图错误是怎么回事

没开xming 开了再运行
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-3-21 16:41:56 | 显示全部楼层
jianglegejiang 发表于 2017-3-12 16:54
没开xming 开了再运行

离开好久了,不好意思刚看到,问题已经解决了,谢谢高手解答
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-3-30 14:30:59 | 显示全部楼层
hongfei0403 发表于 2018-3-21 16:41
离开好久了,不好意思刚看到,问题已经解决了,谢谢高手解答

怎么解决的
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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