gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:09:10 25 4
gpt4 key购买 nike

我有一个非常大的大端二进制文件。我知道这个文件中有多少个数字。我找到了一个如何使用结构读取大端文件的解决方案,如果文件很小,它可以完美地工作:

    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 个 float 。上面的代码使用这个文件大约需要 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.float 中的每 4 位转换一次。有没有可能让程序运行得更快?

最佳答案

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

numpy.fromfile(filename, dtype='>f')

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

关于python - 读取一个大的 big-endian 二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40397731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com