爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 6490|回复: 2

[作图] NCL处理数据的内存问题

[复制链接]

新浪微博达人勋

发表于 2020-4-27 10:29:13 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 奋豆儿 于 2020-4-27 10:29 编辑

因目前条件所限没有服务器可以使用,所以在本地安装cygwin调用NCL来插值interim数据,想一次性把所需的5个变量插值到新建的5个(124,11,251,461)大小的数组,出现如下错误提示,提示的错误是在新建第5个数组的语句位置(20行)。请大家指教!
  1. f0=addfile("SWCWARMS_20180301000000_F00_P10.grb","r")
  2.   u0=f0->U_GRD_GDS0_ISBL(:,{17:42},{77:123})
  3.   v0=f0->V_GRD_GDS0_ISBL(:,{17:42},{77:123})
  4.   z0=f0->HGT_GDS0_ISBL(:,{17:42},{77:123})
  5.   t0=f0->TMP_GDS0_ISBL(:,{17:42},{77:123})
  6.   q0=f0->SPF_H_GDS0_ISBL(:,{17:42},{77:123})  
  7.   
  8.    mid_data_u=new((/124,11,251,461/),float,u0@_FillValue)
  9.    mid_data_u!0="time"
  10.    mid_data_u&time=ispan(0,123,1)
  11.    mid_data_v=new((/124,11,251,461/),float,u0@_FillValue)
  12.    mid_data_v!0="time"
  13.    mid_data_v&time=ispan(0,123,1)
  14.    mid_data_z=new((/124,11,251,461/),float,u0@_FillValue)
  15.    mid_data_z!0="time"
  16.    mid_data_z&time=ispan(0,123,1)
  17.    mid_data_q=new((/124,11,251,461/),float,u0@_FillValue)
  18.    mid_data_q!0="time"
  19.    mid_data_q&time=ispan(0,123,1)
  20.    mid_data_t=new((/124,11,251,461/),float,u0@_FillValue)
  21.    mid_data_t!0="time"
  22.    mid_data_t&time=ispan(0,123,1)
  23.        ;print (f0->lv_ISBL0)

  24.        copyatt(mid_data_u(0,:,:,:), u0)
  25.        copyatt(mid_data_v(0,:,:,:), v0)
  26.        copyatt(mid_data_z(0,:,:,:), z0)
  27.        copyatt(mid_data_t(0,:,:,:), t0)
  28.        copyatt(mid_data_q(0,:,:,:), q0)
  29.        ;printVarSummary(mid_data_u)
  30.   
  31.      delete(f0)
  32.      delete(u0)
  33.      delete(v0)
  34.      delete(z0)
  35.      delete(t0)
  36.      delete(q0)
  37.      
  38.   
  39. ;===determine the output file's name===
  40.   m=mon+1
  41.   if (mon .le. 9)
  42.    output_nm="./"+"0"+mon+"01-"+"0"+m+"03"+"/"+year+"0"+mon+"01-"+"0"+m+"03inter.nc"
  43.   else
  44.    output_nm="./"+mon+"01-"+m+"03"+"/"+year+mon+"01-"+m+"03inter.nc"
  45.   end if  
  46.   print(output_nm)
  47.   
  48. ;=======time loop start======
  49.   if (mon .le. 9)
  50.    in_filenm="./"+"0"+mon+"01-"+"0"+m+"03"+"/"+year+"0"+mon+"01-"+"0"+m+"03.nc"
  51.   else
  52.    in_filenm="./"+mon+"01-"+m+"03"+"/"+year+mon+"01-"+m+".nc"
  53.   end if  
  54.   print(in_filenm)
  55.   
  56.      
  57.   f1=addfile("./SWCWARMS_20180301000000_F00-72_P10.nc","r")
  58.   f2=addfile(in_filenm,"r")
  59.    
  60.   lat_fore=f1->g0_lat_0
  61.   lon_fore=f1->g0_lon_1
  62.   
  63.   lat_obs=f2->latitude(::-1)
  64.   lon_obs=f2->longitude
  65.   
  66.   levels=(/100, 200, 250, 300, 400, 500, 600, 700, 850, 925, 1000/)

  67.    do i=0, 10
  68.     obs1_z_cli=f2->z(:,{levels(i)},::-1,:)
  69.     obs1_u_cli=f2->u(:,{levels(i)},::-1,:)  
  70.     obs1_v_cli=f2->v(:,{levels(i)},::-1,:)  
  71.     obs1_t_cli=f2->t(:,{levels(i)},::-1,:)
  72.     obs1_q_cli=f2->q(:,{levels(i)},::-1,:)
  73.    
  74.     obs_u_cli=linint2_Wrap (lon_obs,lat_obs,obs1_u_cli, False, lon_fore,lat_fore, 0)
  75.     obs_v_cli=linint2_Wrap (lon_obs,lat_obs,obs1_v_cli, False, lon_fore,lat_fore, 0)  
  76.     obs_t_cli=linint2_Wrap (lon_obs,lat_obs,obs1_t_cli, False, lon_fore,lat_fore, 0)
  77.     obs_q_cli=linint2_Wrap (lon_obs,lat_obs,obs1_q_cli, False, lon_fore,lat_fore, 0)
  78.     obs_z_cli=linint2_Wrap (lon_obs,lat_obs,obs1_z_cli, False, lon_fore,lat_fore, 0)
  79.    
  80.     mid_data_z(:, {levels(i)}, :,:) = obs_z_cli(:,:,:)
  81.     mid_data_u(:, {levels(i)}, :,:) = obs_u_cli(:,:,:)
  82.     mid_data_v(:, {levels(i)}, :,:) = obs_v_cli(:,:,:)
  83.     mid_data_t(:, {levels(i)}, :,:) = obs_t_cli(:,:,:)
  84.     mid_data_q(:, {levels(i)}, :,:) = obs_q_cli(:,:,:)
  85.    end do
  86. setfileoption("nc", "Format",  "NetCDF4")
  87. a = systemfunc("rm -f " + output_nm)
  88. fout=addfile(output_nm, "c")
  89.   
  90. fout->u=mid_data_u
  91. fout->v=mid_data_v
  92. fout->z=mid_data_z
  93. fout->t=mid_data_t
  94. fout->q=mid_data_q
  95. delete(fout)
复制代码


根据提示查了一下,可能是因为数组太大内存(本地台式机内存6G)不够的原因,所以考虑一个变量一个变量插值,对不同年份的数据进行年循环,先用变量U试了一下代码如下:

  1. do mon=2, 2
  2.    do year=2001, 2018

  3.   
  4. ;===determine the output file's name===
  5.   m=mon+1
  6.   if (mon .le. 9)
  7.    output_nm="./"+"0"+mon+"01-"+"0"+m+"03"+"/"+year+"0"+mon+"01-"+"0"+m+"03inter.nc"
  8.   else
  9.    output_nm="./"+mon+"01-"+m+"03"+"/"+year+mon+"01-"+m+"03inter.nc"
  10.   end if  
  11.   print(output_nm)
  12.   
  13. ;=======time loop start======
  14.   if (mon .le. 9)
  15.    in_filenm="./"+"0"+mon+"01-"+"0"+m+"03"+"/"+year+"0"+mon+"01-"+"0"+m+"03.nc"
  16.   else
  17.    in_filenm="./"+mon+"01-"+m+"03"+"/"+year+mon+"01-"+m+".nc"
  18.   end if  
  19.   print(in_filenm)
  20.   

  21.      
  22.   f1=addfile("./SWCWARMS_20180301000000_F00-72_P10.nc","r")
  23.   f2=addfile(in_filenm,"r")
  24.    
  25.   lat_fore=f1->g0_lat_0
  26.   lon_fore=f1->g0_lon_1
  27.   
  28.   lat_obs=f2->latitude(::-1)
  29.   lon_obs=f2->longitude
  30.   
  31.   levels=(/100, 200, 250, 300, 400, 500, 600, 700, 850, 925, 1000/)

  32.   f0=addfile("SWCWARMS_20180301000000_F00_P10.grb","r")
  33.   u0=f0->U_GRD_GDS0_ISBL(:,{17:42},{77:123})
  34.   v0=f0->V_GRD_GDS0_ISBL(:,{17:42},{77:123})
  35.   z0=f0->HGT_GDS0_ISBL(:,{17:42},{77:123})
  36.   t0=f0->TMP_GDS0_ISBL(:,{17:42},{77:123})
  37.   q0=f0->SPF_H_GDS0_ISBL(:,{17:42},{77:123})  
  38.   
  39.    mid_data_u=new((/124,11,251,461/),float,u0@_FillValue)
  40.    mid_data_u!0="time"
  41.    mid_data_u&time=ispan(0,123,1)

  42.    copyatt(mid_data_u(0,:,:,:), u0)
  43.    delete(u0)

  44.    do i=0, 10
  45.     obs1_u_cli=f2->u(:,{levels(i)},::-1,:)  
  46.     obs_u_cli=linint2_Wrap (lon_obs,lat_obs,obs1_u_cli, False, lon_fore,lat_fore, 0)
  47.     mid_data_u(:, {levels(i)}, :,:) = obs_u_cli(:,:,:)
  48.    end do
  49.   
  50.   
  51. setfileoption("nc", "Format",  "NetCDF4")
  52. a = systemfunc("rm -f " + output_nm)
  53. fout=addfile(output_nm, "c")
  54.   
  55. fout->u=mid_data_u
  56. ; fout->v=mid_data_v
  57. ; fout->z=mid_data_z
  58. ; fout->t=mid_data_t
  59. ; fout->q=mid_data_q
  60. delete(fout)
  61. delete(obs1_u_cli)
  62. delete(f2)
  63. delete(i)
  64.    end do
  65.   end do
复制代码
结果第一年的结果出来了没有问题,第二年插值又不行了,提示如下(错误提示2),不知道是不是还是内存不够的问题?试过把第一年数据插值使用过的数组都清空还是一样的提示,所提示的语句为50行obs1_u_cli=f2->u(:,{levels(i)},::-1,:) 感觉没啥问题。

错误提示

错误提示

错误提示2

错误提示2
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2020-4-27 11:00:29 | 显示全部楼层
错误提示1可以通过在注册表中cygwin位置下建32位DWORD值来解决,把值设成1024.同时及时delete脚本中不用的变量
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-4-27 14:55:10 | 显示全部楼层
Grace123 发表于 2020-4-27 11:00
错误提示1可以通过在注册表中cygwin位置下建32位DWORD值来解决,把值设成1024.同时及时delete脚本中不用的 ...

好的谢谢您,我试试!
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

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