估计二进制文件的大小

时间:2014-12-18 01:22:48

标签: fortran size binaryfiles double-precision

我对此非常困惑。 我转出一个大小为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字节的文件。

2 个答案:

答案 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个字节标记记录的开始和结束。