File 减少FORTRAN中输出文件的大小
我希望在不丢失任何数据的情况下最小化FORTRAN中输出文件的大小。为了找到最好的方法,我编写了以下程序:File 减少FORTRAN中输出文件的大小,file,binary,fortran,size,File,Binary,Fortran,Size,我希望在不丢失任何数据的情况下最小化FORTRAN中输出文件的大小。为了找到最好的方法,我编写了以下程序: program test character(len=255) format 1 format(9i3)
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个字节)与我类似的问题是:虽然没有直接回答您的问题,但我想指出,如果使用二进制数据,文件大小有一个下限。即使使用最密集的存储表示形式,但没有任何校验和或记录长度等元信息,也必须存储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