2016-11-21 57 views
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。

回答

2

其中最快的方法是使用NumPy。創建一個數組並將其直接寫入文件,或者使用它們的功能memmap()函數。

+0

我到目前爲止所做的是編寫一個NumPy數組,當它的長度大於1000個項目時,我直接將它寫入文件(使用pickle.dump)。memmap()函數的問題是我必須設置一個形狀和我的數組形狀是可變的,因此當所有的項目已經添加到數組中並且我知道它的形狀時,我可以使用memmap(),但是當數組的長度大於1000時不使用memmap()。我對嗎? – Pablo

+0

不要使用pickle將NumPy數組寫入文件!使用'np.save()'或'np.memmap()'或NumPy中直接編寫它的其他函數之一。如果您事先不知道有多少元素,只需在陣列中分配最大數量,然後最後只寫出您需要的部分,例如'np.save('filename.npy',array [:10000]'。 –