file - 减少 FORTRAN 中输出文件的大小

标签 file binary fortran size

我想在不丢失任何数据的情况下最小化 FORTRAN 中输出文件的大小。为了找到这样做的最佳方法,我编写了程序:

      program test                                                              

      character(len=255) format

1     format(9i3)                                                               

c FORMATTED          
      open(99,file='form1.txt',form='formatted')                                
      do i=1,1                                                            
        write(99,1) 1, 2, 3, 4, 5, 6, 7, 8, 9                                   
      enddo                                                                     
      close(99)                                                                 

c UNFORMATTED          
      open(98,file='form2.txt',form='unformatted')                              
      do i=1,1                                                            
        write(98) 1, 2, 3, 4, 5, 6, 7, 8, 9                                     
      enddo                                                                     
      close(98)                                                                 

c DIRECT ACCESS          
      nrec=sizeof(i)*9                                                          
      open(97,file='form3.txt',form='unformatted',                              
     &     access='direct',recl=nrec)                                           
      do i=1,1                                                            
        write(97,rec=i) 1, 2, 3, 4, 5, 6, 7, 8, 9                               
      enddo                                                                     
      close(97)                                                                 

      call system('ls -lh form?.txt')                                           
      end

这将创建三个文件,每个文件有一条记录。这个程序的输出是:

-rw-r--r--. 1 user users  28 May 27 17:10 form1.txt
-rw-r--r--. 1 user users  44 May 27 17:10 form2.txt
-rw-r--r--. 1 user users  36 May 27 17:10 form3.txt

来自 Oracle's website :

If FORM='UNFORMATTED', each record is preceded and terminated with an INTEGER*4 count, making each record 8 characters longer than normal. This convention is not shared with other languages, so it is useful only for communicating between FORTRAN programs.

我的问题是:

  1. 为什么 form1.txtform2.txt 之间有 16 个字节的差异(而不是前面引用中提到的 8 个字节)?请注意,file1.txt 的大小取决于格式(例如,如果我将行 format(9i3) 更改为 format(9i4) file1.txt 的文件大小增加了 9 个字节)。

我的主要问题是:

  1. 我有一个包含五列和数百万行的大数据文件(大于 100G)。 FORTRAN 中减小输出文件大小的最佳方法是什么(也许以二进制形式写入)?

与我类似的问题是:Best way to write a large array to file in fortran? Text vs Other

最佳答案

基本上,您的格式 9i3 意味着每个数字将在文件中正好占用 3 个字节。那是 27 个字节加上一个回车符就是 28。

但是您只能以这种格式存储最多 999 的数字,即使这样,超过 99 的数字也会混合在一起。

未格式化的直接访问存储整数的二进制表示形式,因此每个数字为 32 位或 4 个字节。总共 36 个字节。这比格式化版本的 28 多,但它可以处理所有整数,最大为 2,147,483,647,最小为 -2,147,483,648,同时大小仍然相同。 (如果您希望格式化版本具有相同的灵 active ,则需要格式 9I11 总共 100 个字节)。

未格式化(顺序)版本有点中间,因为未格式化,它存储二进制表示,但它仍然存储一些元数据(记录长度),这就是为什么它更大一点,但像未格式化直接访问,您可以以这种方式存储所有整数,同时占用相同的空间量。

至于你的第二个问题,你应该使用什么取决于很多事情。正如您所注意到的,如果您的整数始终介于 0 和 99 之间,那么它们的字符串表示形式小于它们的二进制表示形式。但是一旦你需要 4 位数字(包括符号),二进制表示就会变小。我可能还应该指出,如果您的数字很小,您不妨将它们声明为 8 位或 16 位整数,这意味着它们分别只占用一个或两个字节。

二进制表示也更快,因为数字不需要在二进制和字符串之间转换。

但对于您所说的尺寸,研究其他文件格式可能很有值(value),例如 NetCDF它有一些压缩数据的方法。

关于file - 减少 FORTRAN 中输出文件的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50557420/

相关文章:

C++ mfc csv 文件读取

c - c 中的 fread() 怪异行为

database - 写入文本文件或通过键/值数据库的速度

c++ - 数组到十六进制表示

python - 从 ctypes 访问公共(public) block 变量

performance - 将屏蔽数组添加到另一个 Fortran 的最有效方法

java - 使用 FileInputStream : A file is in a different file format than its extension indicates 保存 xls 文件

java - 获取大小为 n 但只有 k 个 1 的所有二进制组合

c - 按位运算相当于大于运算符

fortran - 将英特尔风格预处理器转换为与 gfortran 一起使用