2017-03-21 48 views
2

創建我正在剝奪其最低限度之下的分佈式模型netCDF文件:回顧性關閉與Fortran語言

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中編寫文件的方法,即使不關閉文件也可以使文件可讀?

+1

可以在每個循環步驟調用['nf90_sync'](http://www.unidata.ucar.edu/software/netcdf/netcdf-4/newdocs/netcdf-f90/NF90_005fSYNC.html)(或一些循環步驟),它應該將緩衝數據寫入文件並可能解決一些問題。我不知道是否可以追溯關閉文件。 – SteveES

+1

調用'nf90_sync'應該可以。另一種選擇是使用'NF90_SHARE'標誌創建文件。這可能比明確同步文件時更麻煩。 – RussF

+1

你實際上可以在fortran中創建一個MWE,我在這裏沒有看到問題。這很好,因爲在程序崩潰的地方它確實很重要。然而,按照之前的評論所說的同步應該做到這一點,如果沒有,也可以在每一步中關閉/打開文件(有一些開銷,所以不是建議的解決方案),或者寫更多和更小的文件並稍後合併它們進入HDF5邏輯組。 – kakk11

回答

1

當調用nf90_close時,緩衝輸出寫入磁盤,文件ID被放棄,因此可以重新使用。問題很可能是由於緩衝輸出在程序因崩潰而終止時未寫入磁盤,這意味着只有您在「define mode」中進行的更改存在於文件中(如ncdump所示)。

因此,您需要強制更頻繁地將數據寫入磁盤。有三種方法可以做到這一點(據我所知)。

  • nf90_sync - 它在調用時將緩衝的數據同步到磁盤。這使您可以最大限度地控制何時輸出數據(例如,每個循環步驟或每n個循環步驟),這可以使您針對速度和健壯性進行優化,但會爲您帶來更多編程和檢查開銷。
  • 感謝@RussF這個想法。使用nf90_share標誌創建或打開文件。如果netCDF文件旨在被多個讀寫器同時使用,則這是推薦的方法。它與用於寫入數據的自動實現nf90_sync基本相同。它減少了控制,但也減少了編程開銷。請注意:

    這隻適用於netCDF-3 classic或64位偏移量文件。

  • 最後,我不會推薦一個選項,但包括完整性(我猜可能有些情況下這是最好的選擇,儘管沒有想到) - 關閉並重新打開文件。我不建議這樣做,因爲它會減慢你的程序,並增加導致錯誤的更大可能性。
+0

我會添加一個將文件拆分成更小塊的選項。我普遍認爲,在每次迭代中關閉和打開文件並不是很好的性能,但爲什麼它可能導致更多的錯誤還不清楚。 – kakk11

+0

@ kakk11,公平點,除非你寧願建議編輯,或自己提供答案,否則我會補充說明另一個建議。 – SteveES

+0

@ kakk11至於引起錯誤,我猜它比事實更「迷信」,但我的推理是基於導致錯誤的小風險積累(例如,當連接到磁盤/試圖打開/關閉文件時) - 每個時間不會更不可能失敗,但是你調用這些函數的次數越多,就越有可能出現錯誤。每次打開和關閉涉及更多的這些潛在的錯誤潛力,所以更容易出錯。 (現在我等着被擊落......) – SteveES