Я проверил 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, но и для записи).
спасибо.
Пабло.
То, что я сделал до сих пор, заключалось в том, чтобы написать массив NumPy, и когда его длина была больше 1000 элементов, я написал ее непосредственно в файл (используя pickle.dump). Проблема с функцией memmap() заключается в том, что я должен установить форма и моя форма массива являются переменными, поэтому я просто могу использовать memmap(), когда все элементы были добавлены в массив, и я знаю его форму, но не используя memmap(), когда длина массива больше 1000. Я прав? – Pablo
Не используйте pickle для записи массива NumPy в файл! Используйте 'np.save()' или 'np.memmap()' или одну из многих других функций NumPy, которые непосредственно ее записывают. Если вы не знаете, сколько элементов заранее, просто выделите наибольшее количество, которое вы ожидаете в массиве, а затем в конце напишите только нужную вам часть, например. 'np.save ('filename.npy', array [: 10000]'. –