如何估算由 Fortran 编写的包含矩阵的文本文件的大小?
How to approximate the size of a text file containing a matrix, written by Fortran?
我已经使用 Fortran 将 N*N
矩阵写入格式化文本文件。 Fortran output format 是 N(3X,E17.8)
,其中 N
是矩阵大小。
一个矩阵元素的示例: 0.19860753E-08
即“(三个空格)0.19860753E-08”。
一个558x558
矩阵的文件大小为5.294.302 Bytes
。
对于 N
的任何值,我如何估算 N*N
矩阵的文件大小?
我不确定你的行是分开的还是所有数字都按顺序排列。
如果我没看错你的描述,每行 N(3X,E17.8)
。在那种情况下,每个字符都是一个字节。 3 个空格 + 17 个字符 = 20 个字节。一行是 20 * N + 1(或 Windows 上的 + 2)。 +1 或 +2 是行尾标记(LF 或 CR + LF)。 (这种区别是 unix2dos
和 dos2unix
实用程序转换的内容。)
那么你有N行,所以应该是N*(20 * N + 1).
这与您显示的数字不符。
但是你展示的例子和你展示的格式不一致。数字 0.19860753E-08
实际上只是 17 个字符 (3X,E14.8)
。在那种情况下,它是 N*(17 * N +1 ) + 1
或最终 N*(17 * N + 2)
与 CR + LF。这对应于您引用的文件大小要好得多。 558 * (17 * 558 + 2) = 5 294 304.
对于按
格式写入的单条记录
write (*, '(999(3X,E17.8)') a
我们可以确定要写入多少个字符。对于每个元素,将有三个空格后跟一个宽度为 17 的字段:每个元素总共有 20 个字符。然后会有若干个字符结束记录(取决于文件系统、操作系统等,通常是一个或两个)。
知道每条记录有多大,写了多少条记录,就知道大小了。再次取决于系统设置,您可能还会看到一个单独的 end-of-file 大小的标记。
我们可以回答这个问题,因为我们知道每个字段的大小。我们并不总是从格式中知道这一点。例如,对于某些编辑描述符,字段宽度稍后确定:A
、I0
、G0.6
等。
最后,还要注意,如果不对冒号进行编辑,我们可能会得到一个元素的额外输出。 X
是一个特例,如果我们改为
write (*, '(999(" ",E17.8)') a
然后在记录结束之前写出的最后一个元素之后会有三个空格额外的空格。这可以在
中避免
write (*, '(999(" ":,,E17.8)') a
X
是位置编辑描述符:它实际上并不传输数据,因此不会添加到传输计数中,除非写入更多数据。
与其根据代码和文件格式的细节计算文件的大小,写出包含具有(至少)三个不同 N
值的矩阵的文件可能更简单。然后,您可以将文件大小 S
作为 N
的函数,作为
S = a*N^2 + b*N + c
其中 a
、b
和 c
是您将从拟合中获得的常数。
a*N^2
项来自矩阵中数字的表示。
b*N
术语来自行结尾,以及您可能使用的任何值分隔符。
c
术语来自文件元数据以及文件中可能包含的任何备用字符。
我已经使用 Fortran 将 N*N
矩阵写入格式化文本文件。 Fortran output format 是 N(3X,E17.8)
,其中 N
是矩阵大小。
一个矩阵元素的示例: 0.19860753E-08
即“(三个空格)0.19860753E-08”。
一个558x558
矩阵的文件大小为5.294.302 Bytes
。
对于 N
的任何值,我如何估算 N*N
矩阵的文件大小?
我不确定你的行是分开的还是所有数字都按顺序排列。
如果我没看错你的描述,每行 N(3X,E17.8)
。在那种情况下,每个字符都是一个字节。 3 个空格 + 17 个字符 = 20 个字节。一行是 20 * N + 1(或 Windows 上的 + 2)。 +1 或 +2 是行尾标记(LF 或 CR + LF)。 (这种区别是 unix2dos
和 dos2unix
实用程序转换的内容。)
那么你有N行,所以应该是N*(20 * N + 1).
这与您显示的数字不符。
但是你展示的例子和你展示的格式不一致。数字 0.19860753E-08
实际上只是 17 个字符 (3X,E14.8)
。在那种情况下,它是 N*(17 * N +1 ) + 1
或最终 N*(17 * N + 2)
与 CR + LF。这对应于您引用的文件大小要好得多。 558 * (17 * 558 + 2) = 5 294 304.
对于按
格式写入的单条记录write (*, '(999(3X,E17.8)') a
我们可以确定要写入多少个字符。对于每个元素,将有三个空格后跟一个宽度为 17 的字段:每个元素总共有 20 个字符。然后会有若干个字符结束记录(取决于文件系统、操作系统等,通常是一个或两个)。
知道每条记录有多大,写了多少条记录,就知道大小了。再次取决于系统设置,您可能还会看到一个单独的 end-of-file 大小的标记。
我们可以回答这个问题,因为我们知道每个字段的大小。我们并不总是从格式中知道这一点。例如,对于某些编辑描述符,字段宽度稍后确定:A
、I0
、G0.6
等。
最后,还要注意,如果不对冒号进行编辑,我们可能会得到一个元素的额外输出。 X
是一个特例,如果我们改为
write (*, '(999(" ",E17.8)') a
然后在记录结束之前写出的最后一个元素之后会有三个空格额外的空格。这可以在
中避免write (*, '(999(" ":,,E17.8)') a
X
是位置编辑描述符:它实际上并不传输数据,因此不会添加到传输计数中,除非写入更多数据。
与其根据代码和文件格式的细节计算文件的大小,写出包含具有(至少)三个不同 N
值的矩阵的文件可能更简单。然后,您可以将文件大小 S
作为 N
的函数,作为
S = a*N^2 + b*N + c
其中 a
、b
和 c
是您将从拟合中获得的常数。
a*N^2
项来自矩阵中数字的表示。b*N
术语来自行结尾,以及您可能使用的任何值分隔符。c
术语来自文件元数据以及文件中可能包含的任何备用字符。