我对此非常困惑。 我转出一个大小为16000 * 4 * 2的3D数组,其中所有元素都是DOUBLE PRECISION,我认为我应该得到一个大小为16000 * 4 * 2 * 8字节/ dp = 1,024,000字节的文件。 但我一直得到2,048,000字节。
我测试了一个简单的测试程序:
PROGRAM testprog
IMPLICIT NONE
DOUBLE PRECISION :: x=0.0D0
INTEGER :: i
OPEN(UNIT=128,FILE='try.out',FORM='UNFORMATTED',ACCESS='SEQUENTIAL')
DO i=1,16000*4*2
WRITE(128) x
ENDDO
CLOSE(128)
ENDPROGRAM testprog
使用以下命令运行它:
gfortran f.f90 -o a
./a
ls -als try.out
我得到的是
2000 -rw-r--r-- 1 jipuwang umstudents 2048000 Dec 17 20:16 try.out
我无法理解它。一个双精度使用2个字节对吗?
我做了别的事,如果有人也能帮我理解这个:
PROGRAM testprog
IMPLICIT NONE
DOUBLE PRECISION :: x=0.0D0
INTEGER :: i
OPEN(UNIT=128,FILE='try.out')
DO i=1,2
WRITE(128,*) x
ENDDO
CLOSE(128)
ENDPROGRAM testprog
它给了我一个大小为54字节的文件。
答案 0 :(得分:8)
未格式化的顺序文件 - 您正在使用的是一种面向记录的文件格式。对于每个记录,通常将一些簿记字段写入文件以使处理器能够从记录导航到记录。细节可能因编译器而异,但编译器之间存在合理的一致性。
因为您调用WRITE 16000 * 4 * 2次,所以您正在编写16000 * 4 * 2条记录。您将产生16000 * 4 * 2批次的每记录开销。每个记录的八个字节的开销(四个字节的长度超前和跟踪记录数据)是典型的。
如果这个开销有问题,那么考虑为每条记录写更多的值。您甚至可以将整个数据集放在一个记录中。
双精度变量通常占用8个字节,但它会因平台,编译器和编译选项而异。
答案 1 :(得分:2)
你想转储一个数组,所以我假设你有一个3d数组。然后你的程序变成:
PROGRAM testprog
IMPLICIT NONE
DOUBLE PRECISION :: x(16000,4,2)
INTEGER :: i
OPEN(UNIT=128,FILE='try.out',FORM='UNFORMATTED',ACCESS='SEQUENTIAL')
WRITE(128) x
CLOSE(128)
ENDPROGRAM testprog
现在,文件大小为4 + 16000 * 4 * 2 * 8 + 4字节长。第一个和最后4个字节标记记录的开始和结束。