1
我检查了2种方法来读取使用Python /用Cython二进制文件:更快的方式写的二进制文件与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但写的东西)。
谢谢。
Pablo。
我到目前为止所做的是编写一个NumPy数组,当它的长度大于1000个项目时,我直接将它写入文件(使用pickle.dump)。memmap()函数的问题是我必须设置一个形状和我的数组形状是可变的,因此当所有的项目已经添加到数组中并且我知道它的形状时,我可以使用memmap(),但是当数组的长度大于1000时不使用memmap()。我对吗? – Pablo
不要使用pickle将NumPy数组写入文件!使用'np.save()'或'np.memmap()'或NumPy中直接编写它的其他函数之一。如果您事先不知道有多少元素,只需在阵列中分配最大数量,然后最后只写出您需要的部分,例如'np.save('filename.npy',array [:10000]'。 –