LoginSignup
3
3

More than 5 years have passed since last update.

Fortranの大きいサイズのファイル出力について

Last updated at Posted at 2017-02-23

IDLでfortranで生成された2GB以上のファイルを読み込もうとするとエラーが出てしまうことから、問題が始まった。例えば以下のようなコードで2GB以上のデータを書き込んだとする。

Fortran プログラム

program main
  implicit none
  integer(8) :: i,j,k
  integer(8), parameter :: ix = 1024, jx = 1024, kx = 512
  real(8), dimension(ix,jx,kx) :: qq

  qq = 2.d0

  open(10,file="test.dac",form="unformatted")
  write(10) qq
  close(10)

  stop
end program main

データサイズは1024*1024*128*8=4,294,967,296 byte~4.2GBとなる。
上記で生成したデータを以下のIDLプルグラムで読み込もうとする。
IDLプログラム


ix = 1024
jx = 1024
kx = 512

qq = dblarr(ix,jx,kx)

openr,10,"test.dac",/f77_unformatted
readu,10,qq
close,10

end

すると

% READU: Corrupted f77 unformatted file detected. Unit: 10, File: test.dac

というエラーが出て止まる。詳しくはよくわからないが、2GBを超えるファイルはマーカーがうまく表現できないようだ。よってFortranのunformattedで出力・入力するのが良いと思われる。
そこでFortranプログラムを以下のように書き換える。openのところを書き換えただけ。


program main
  implicit none
  integer(8) :: i,j,k
  integer(8), parameter :: ix = 1024, jx = 1024, kx = 512
  real(8), dimension(ix,jx,kx) :: qq

  qq = 2.d0

  open(10,file="test.dac",form="unformatted",access="stream")
  write(10) qq
  close(10)

  stop
end program main

これに対応して、IDLプログラムはf77_unformattedを外す。

ix = 1024
jx = 1024
kx = 512

qq = dblarr(ix,jx,kx)

openr,10,"test.dac"
readu,10,qq
close,10

end

f77_unformattedも書かなくていいし、サイズの制限もないのでこれからはこれで出力するのがよいと思われる。
多変数の時も並べて書けばいいだけ。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3