我想在不丢失任何数据的情况下最小化 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.
我的问题是:
- 为什么
form1.txt
和form2.txt
之间有 16 个字节的差异(而不是前面引用中提到的 8 个字节)?请注意,file1.txt
的大小取决于格式(例如,如果我将行format(9i3)
更改为format(9i4)
file1.txt
的文件大小增加了 9 个字节)。
我的主要问题是:
- 我有一个包含五列和数百万行的大数据文件(大于 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/