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
データサイズは10241024128*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も書かなくていいし、サイズの制限もないのでこれからはこれで出力するのがよいと思われる。
多変数の時も並べて書けばいいだけ。