2016-11-21 13 views
1

Я проверил 2 способа, чтобы прочитать двоичный файл с помощью Python/Cython:Быстрее способ записать двоичный файл с Python/Cython

Первый использует ММАП и модуль 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] 

второй один использует ММАП и 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() 

, но я хотел бы знать, если есть более быстрый способ (или что-то похожее на ттар + from_buffer, но и для записи).

спасибо.

Пабло.

ответ

2

Среди наиболее быстрых способов можно будет использовать NumPy. Создайте массив и напишите его непосредственно в файл или используйте функцию memmap().

+0

То, что я сделал до сих пор, заключалось в том, чтобы написать массив NumPy, и когда его длина была больше 1000 элементов, я написал ее непосредственно в файл (используя pickle.dump). Проблема с функцией memmap() заключается в том, что я должен установить форма и моя форма массива являются переменными, поэтому я просто могу использовать memmap(), когда все элементы были добавлены в массив, и я знаю его форму, но не используя memmap(), когда длина массива больше 1000. Я прав? – Pablo

+0

Не используйте pickle для записи массива NumPy в файл! Используйте 'np.save()' или 'np.memmap()' или одну из многих других функций NumPy, которые непосредственно ее записывают. Если вы не знаете, сколько элементов заранее, просто выделите наибольшее количество, которое вы ожидаете в массиве, а затем в конце напишите только нужную вам часть, например. 'np.save ('filename.npy', array [: 10000]'. –