我有一个非常大的大端二进制文件。我知道这个文件中有多少个数字。我找到了一个如何使用 struct 读取大端文件的解决方案,如果文件很小,它可以完美运行:
data = []
file = open('some_file.dat', 'rb')
for i in range(0, numcount)
data.append(struct.unpack('>f', file.read(4))[0])
Run Code Online (Sandbox Code Playgroud)
但是,如果文件大小超过 ~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)
Run Code Online (Sandbox Code Playgroud)
这段代码运行大约 1.5 分钟,但这对我来说太慢了。早些时候我在 Fortran 中编写了相同的功能代码,它在大约 10 秒内运行。
在 Fortran 中,我用标志“big-endian”打开文件,我可以简单地读取 REAL 数组中的文件而无需任何转换,但在 python 中,我必须将文件作为字符串读取,并使用 struct 将每 4 个字节转换为浮点数。是否可以使程序运行得更快?
您可以使用numpy.fromfile读取文件,并>在dtype参数中指定类型为big-endian :
numpy.fromfile(filename, dtype='>f')
Run Code Online (Sandbox Code Playgroud)
也有一种array.fromfile方法,但不幸的是,我看不到任何可以控制字节序的方法,因此根据您的用例,这可能会避免对第三方库的依赖或无用。