python读取二进制的dat文件_python-读取大的big-endian二进制文件

我有一个很大的big-endian二进制文件.我知道这个文件中有多少个数字.我找到了一个使用struct读取big-endian文件的解决方案,如果文件很小,它可以完美地工作:

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转换float中的每4位.是否可以使程序运行更快?

解决方法:

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

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

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

标签:file,io,python

来源: https://codeday.me/bug/20191026/1937392.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值