【发布时间】:2017-03-22 23:12:44
【问题描述】:
我正在运行一个分布式模型,在下面被剥离到最低限度:
integer, parameter :: &
nx = 1200,& ! Number of columns in grid
ny = 1200,& ! Number of rows in grid
nt = 6000 ! Number of timesteps
integer :: it ! Loop counter
real :: var1(nx,ny), var2(nx,ny), var3(nx,ny), etc(nx,ny)
! Create netcdf to write model output
call check( nf90_create(path="out.nc",cmode=nf90_clobber, ncid=nc_out_id) )
! Loop over time
do it = 1,nt
! Calculate a lot of variables
...
! Write some variables in out.nc at each timestep
CALL check( nf90_put_var(ncid=nc_out_id, varid=var1_varid, values=var1, &
start = (/ 1, 1, it /), count = (/ nx, ny, 1 /)) )
! Close the netcdf otherwise it is not readable:
if (it == nt) call check( nf90_close(nc_out_id) )
enddo
我处于模型的开发阶段,所以它不可避免地会在意想不到的点崩溃(通常在Calculate a lot of variables阶段),这意味着,如果模型在时间步it =3000崩溃,将写入2999个时间步到 netcdf 输出文件,但我将无法读取该文件,因为该文件尚未关闭。尽管如此,数据已经写入:我目前有一个无法读取的 2GB out.nc 文件。当我ncdump它显示的文件时
netcdf out.nc {
dimensions:
x = 1400 ;
y = 1200 ;
time = UNLIMITED ; // (0 currently)
variables:
float var1 (time, y, x) ;
data:
}
我的问题是:(1) 有没有办法追溯关闭文件,即使在 Fortran 之外,也能读取已经写入的数据? (2) 或者,是否有另一种在 Fortran 中写入文件的方法,即使不关闭文件也可以使文件可读?
【问题讨论】:
-
您可以在每个循环步骤(或多个循环步骤)中调用
nf90_sync,这应该将缓冲数据写入文件并可能解决您的一些问题。不知道是否可以追溯关闭文件。 -
调用
nf90_sync应该可以。另一种选择是使用NF90_SHARE标志创建文件。它可能比一直显式同步文件要简单。 -
您实际上可以在 fortran 中创建 MWE,我认为这里没有问题。这会很好,因为它实际上可能在程序崩溃的地方很重要。但是,正如之前的 cmets 建议的那样,同步应该可以解决问题,如果没有,还有一个选项可以在每个步骤中关闭/打开文件(有一些开销,因此不建议解决方案)或编写更多更小的文件,然后将它们合并到 HDF5 逻辑组中。
-
@SteveES 谢谢,
nf90_sync为我正在创建的新文件工作。 -
@SteveES 我已经按照你的建议编辑了这个问题。