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]'。 –