读取一个大的 big-endian 二进制文件

Gre*_*reg 5 python io file

我有一个非常大的大端二进制文件。我知道这个文件中有多少个数字。我找到了一个如何使用 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 个字节转换为浮点数。是否可以使程序运行得更快?

Bak*_*riu 6

您可以使用numpy.fromfile读取文件,并>dtype参数中指定类型为big-endian :

numpy.fromfile(filename, dtype='>f')
Run Code Online (Sandbox Code Playgroud)

也有一种array.fromfile方法,但不幸的是,我看不到任何可以控制字节序的方法,因此根据您的用例,这可能会避免对第三方库的依赖或无用。