【问题标题】:Fortran output large array to netCDF nf90_enddefFortran 将大数组输出到 netCDF nf90_enddef
【发布时间】:2015-10-22 12:31:30
【问题描述】:

您好,关于 stackoverflow 的第一个问题。

我已经坚持了 5 天。我想用 Fortran 写一个 netcdf 文件。

我正在使用 netcdf/3.6.3 我正在尝试输出一个名为 frech 的大型 43000x 18000 数组和一些较小的数组(一维数组)。

下面是我的代码示例,它是一个非常大的文件,问题不在于为变量输入值,问题在于结束变量的定义:

  print*,"nunks is",nunks
  print*,"neqns is",neqns


  ok=nf90_create('michalek.nc', NF90_CLOBBER, ncid)
  print *,"create ok=",ok

  ok=   nf90_def_dim(ncid,"nunks", nunks, nunks_dimid)
  print *,"def nunks dimension ",ok
  ok=   nf90_def_dim(ncid,"neqns", neqns, neqns_dimid)
  print *,"def neqns dimension ",ok
  dimids=(/neqns_dimid, nunks_dimid/)
  print *,dimids
  ok=   nf90_def_var(ncid,"frech", NF90_REAL, dimids, frech_varid)
  print *,"def frech",ok
  ok=   nf90_def_var(ncid,"src", NF90_REAL, nunks_dimid, src_varid)
  print *,"def src",ok
  ok=   nf90_def_var(ncid,"csrc", NF90_REAL, nunks_dimid, csrc_varid)
  print *,"define csrc",ok
  ok=   nf90_def_var(ncid,"dat", NF90_REAL, neqns_dimid, dat_varid)
  print *,"define dat",ok
  ok=   nf90_def_var(ncid,"cdat", NF90_REAL, neqns_dimid, cdat_varid)
  print *,"define cdat",ok
  ok=   nf90_enddef(ncid)
  print *,"end dif ", ok
  ok=   nf90_put_var(ncid, frech_varid, frech)
  print *, 'frech put in ok=',ok
  ok=   nf90_put_var(ncid, src_varid, src)
  print *, 'src put in ok=',ok
  ok=   nf90_put_var(ncid, csrc_varid, csrc)
  print *, 'csrc put in ok=',ok
  ok=   nf90_put_var(ncid, dat_varid, dat)
  print *, 'dat put in ok=',ok
  ok=   nf90_put_var(ncid, cdat_varid, cdat)
  print *, 'cdat put in ok=',ok
  ok=   nf90_close(ncid)
  print *, 'close?',ok

我知道正确读取文件时 ok=0 但是,当我到达结束文件定义的阶段时 (nf90_enddif) ok 返回为 =-62 并且未创建 netcdf 文件。我想这是一个太大的数组的问题,但我无法解决这个问题

上述代码的相关输出为:

nunks is       43894
neqns is       18144
create ok=           0
def nunks dimension            0
def neqns dimension            0
     2           1
def frech           0
def src           0
define csrc           0
define dat           0
define cdat           0
end dif          -62
frech put in ok=         -39
src put in ok=         -39
csrc put in ok=         -39
dat put in ok=         -39
cdat put in ok=         -39
close?         -62

感谢您的帮助!

问候 彼得:)

【问题讨论】:

  • 您是否尝试过使用可变尺寸来查看较小尺寸是否成功?例如,选择 1000x1000 并逐渐增加以查看问题所在
  • 这是个好主意。但我想避免对代码进行过多的试验,因为它需要 10 分钟才能执行。也许我应该尝试缩短代码的各个方面。

标签: arrays fortran fortran90 netcdf dataoutputstream


【解决方案1】:

在 Argonne-Northwestern 的 Parallel-NetCDF (http://cucis.ece.northwestern.edu/projects/PnetCDF/) 中,我们通过创建 CDF-5 文件格式放宽了文件大小限制。这花了一些时间,但我认为我们在让 Unidata-NetCDF 识别它方面取得了进展。

如果您控制数据的读取者和写入者,您可能想查看具有较新 CDF-5 文件格式的 parallel-netcdf 是否适合您。如果您需要与他人协作,可能需要等到它正式成为 Unidata 的 NetCDF 的一部分(并让 Unidata 知道它对您有用!)。

【讨论】:

    【解决方案2】:

    在不使用无限维度的 NetCDF 经典格式中,您只允许 1 个超过 2GiB 的变量。它也必须是数据集中的最后一个变量,并且到开头的偏移量不超过 2GiB。看起来将frech 移动到最后应该可以。

    【讨论】:

      【解决方案3】:

      这可能是由于 netcdf 中变量大小的限制,4 giga(见下文)。您可能希望在保存之前对数组进行切片或移至 netcdf-4/hdf-5。

      是否消除了所有 netCDF 大小限制?

      基于 netCDF-4 HDF5 的格式对变量的大小没有实际限制。

      但是,对于经典和 64 位偏移格式,netCDF 对象的大小仍然存在限制。每个固定大小的变量(除了最后一个,当没有记录变量时)和单个记录变量(最后一个除外)的一条记录的数据的大小限制为略小于 4 GiB,这是netCDF 3.6 之前版本的大小限制。

      最大记录数保持 232-1。

      详情见http://www.unidata.ucar.edu/software/netcdf/docs/faq.html#Large%20File%20Support10

      【讨论】:

      • 太棒了!我不知道从 netcdf 4 和 3 更改会产生如此大的不同。当我加载较新版本的 netCDF 时它起作用了……如果我在 5 天前问过就好了;)谢谢你的帮助
      • 我很乐意提供帮助。不要忘记接受答案,这样人们就可以停止挖掘其他解决方案。
      猜你喜欢
      • 1970-01-01
      • 2016-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-09
      • 2013-11-11
      • 2019-08-08
      • 2015-03-23
      相关资源
      最近更新 更多