Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 减少FORTRAN中输出文件的大小_File_Binary_Fortran_Size - Fatal编程技术网

File 减少FORTRAN中输出文件的大小

File 减少FORTRAN中输出文件的大小,file,binary,fortran,size,File,Binary,Fortran,Size,我希望在不丢失任何数据的情况下最小化FORTRAN中输出文件的大小。为了找到最好的方法,我编写了以下程序: program test character(len=255) format 1 format(9i3)

我希望在不丢失任何数据的情况下最小化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
发件人:

如果FORM='UNFORMATTED',则每条记录前面都有一个整数*4计数,使每条记录比正常长度长8个字符。此约定不与其他语言共享,因此它仅适用于FORTRAN程序之间的通信

我的问题是:

  • 为什么
    form1.txt
    form2.txt
    之间有16个字节的差异(不是前面引用的8个字节)?请注意,
    file1.txt
    的大小取决于格式(例如,如果我将行
    format(9i3)
    更改为
    format(9i4)
    file1.txt
    的文件大小增加9个字节)
  • 我的主要问题是:

  • 我有五列数百万行的大数据文件(大于100G)。在FORTRAN中,减少输出文件大小(可能以二进制形式编写)的最佳方法是什么
    与我类似的问题是:

    虽然没有直接回答您的问题,但我想指出,如果使用二进制数据,文件大小有一个下限。即使使用最密集的存储表示形式,但没有任何校验和或记录长度等元信息,也必须存储sizeof(datatype)*num_条目字节

    您可以使用一种快速的压缩算法,例如,甚至可以超越C的RAM到RAM
    memcpy()
    。有效性和性能显然在很大程度上取决于数据的分布,但在实际应用程序中可以达到数十GB/s


    100GB的数据可能太多,无法放入计算机的RAM中。可以手动分块文件,也可以使用类似的库。HDF5以高性能为基本上任意数量的数据提供压缩分块存储。然而,即使有一个大型库,合并一个大型库也可能是一项工作。

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

    但您只能以这种格式存储999以下的数字,即使如此,超过99的数字也会混合在一起

    无格式直接访问存储整数的二进制表示,因此每个数字为32位或4字节。总共是36个字节。这比格式化版本的28大,但它可以处理所有整数,最大为2147483647,最小为-2147483648,但大小不变。(如果您希望在格式化版本中具有相同的灵活性,则需要格式化
    9I11
    总共100字节)

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

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

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


    但是对于您正在讨论的大小,研究其他文件格式可能是有价值的,比如它有一些压缩数据的方法。

    在我的示例中,表达式
    sizeof(datatype)*num\u entries
    生成一个36字节的文件,因为
    sizeof(datatype)
    是4而
    num\u entries
    是9。现在我很困惑,因为这是文件大小的下限,但我有另一个文件(
    form1.txt
    )的大小较低(28字节)。文件
    form1.txt
    是一个ascii文件,其中包含一行:
    \uuuuu1\uuuu2\uuu3\uu4\uu5\uu6\uuuu7\uu8\u9
    (这里我使用
    \uuuu
    来表示一个空格)。我(迟来)编辑了答案以使其更清晰。谢谢你@IanH