2016-11-21 33 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]'。 –