我检查了两种使用Python / Cython读取二进制文件的方法:
第一个是使用mmap和struct.unpack模块:
import mmap
import os
import struct
fd = os.open(filePath, os.O_RDONLY)
mmap_file = mmap.mmap(fd, length=24, access=mmap.ACCESS_READ, offset=0)
Xmin = struct.unpack("i", mmap_file[:4])[0]
Xmax = Xmin + struct.unpack("i", mmap_file[12:16])[0]
Ymax = struct.unpack("i", mmap_file[4:8])[0]
Ymin = Ymax - struct.unpack("i", mmap_file[16:20])[0]
Zmax = struct.unpack("1f", mmap_file[8:12])[0]
第二个是使用mmap和from_buffer:
class StructHeaderLID(Structure):
_fields_ = [('Xmin', c_int),('Ymax', c_int),('Zmax', c_float),('tileX', c_int),('tileY', c_int)]
d_array = StructHeaderLID*1
fd = os.open(filePath, os.O_RDWR)
mmap_file = mmap.mmap(fd, length=24, access=mmap.ACCESS_WRITE, offset=0)
data = d_array.from_buffer(mmap_file)
for i in data:
Xmin = i.Xmin
Xmax = Xmin + i.tileX
Ymax = i.Ymax
Ymin = Ymax - i.tileY
Zmax = i.Zmax
我发现第二个更快。
我想解决的问题是编写新二进制文件的最快方法。我知道如何使用struct.pack编写它:
f = open(filePath, 'wb')
line = struct.pack("i", 500000)+struct.pack("i", 4000000)
f.write(line)
f.close()
但我想知道是否有更快的方法(或者类似于mmap + from_buffer但是用于写作)。
谢谢。
巴勃罗。
答案 0 :(得分:2)
最快的方法之一就是使用NumPy。创建一个数组并将其直接写入该文件,或使用他们的memmap()
函数。