我有一个非常大的big-endian二进制文件。我知道这个文件中有多少个数字。我发现了一个解决方案是如何利用结构来读大端文件和它的作品完美的,如果文件很小:阅读一个大的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万桶。 我目前的文件大小为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个浮点数。有可能使程序运行得更快吗?
我也有'struct'的一些不好的经验;一次读取大约1GB的文件(您的第二个示例)完全可以使我的笔记本电脑(8GB)的内存达到最大,这当然会使一切非常缓慢。在我的情况下,以大块阅读是解决方案。 – Bart