【发布时间】:2016-11-03 09:19:20
【问题描述】:
我有一个非常大的大端二进制文件。我知道这个文件中有多少个数字。我找到了一个如何使用 struct 读取大端文件的解决方案,如果文件很小,它就可以完美工作:
data = []
file = open('some_file.dat', 'rb')
for i in range(0, numcount)
data.append(struct.unpack('>f', file.read(4))[0])
但如果文件大小超过 ~100 mb,则此代码运行速度非常慢。 我当前的文件大小为 1.5gb,包含 399.513.600 个浮点数。上面的代码使用这个文件大约需要 8 分钟。
我找到了另一个更快的解决方案:
datafile = open('some_file.dat', 'rb').read()
f_len = ">" + "f" * numcount #numcount = 399513600
numbers = struct.unpack(f_len, datafile)
这段代码运行大约需要 1.5 分钟,但这对我来说太慢了。早些时候,我在 Fortran 中编写了相同的功能代码,它在大约 10 秒内运行。
在 Fortran 中,我打开带有标志“big-endian”的文件,我可以简单地读取 REAL 数组中的文件而无需任何转换,但在 python 中,我必须将文件作为字符串读取,并使用 struct 每 4 位转换为浮点数。是否有可能使程序运行得更快?
【问题讨论】:
-
我对@987654323@也有一些不好的经历;一次读取约 1GB 的文件(您的第二个示例)完全耗尽了我笔记本电脑上的内存(8GB),这当然会使一切变得非常慢。分块阅读是我的解决方案。