我有一個非常大的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