2015-01-28 3 views
3

У меня есть файлы порядка десятков ГБ, которые состоят из смеси из 10 или около того упакованных структур C. Мне нужно иметь возможность перебирать каждую структуру в файле для анализа и хотеть иметь возможность сделать этот анализ в коде python. Мне вообще не нужно писать в файл.Самый быстрый способ разбора большого двоичного файла в python

Я не думаю, что numpy может помочь здесь, потому что файлы - это не просто одна повторяющаяся структура. struct.unpack Я считаю слишком медленным.

Моей идеей до сих пор является использование Cython и mmap файла, а затем итерация и передача буфера в структуры Cython C в надежде избежать ненужного копирования. Захват, с которым я столкнулся с этим подходом, хотя я не могу напрямую использовать указатель структуры Cython C и должен эффективно писать классы оболочки python, что делает вещи немного медленнее и утомительно писать. Кто-нибудь знает об этом?

Хотите узнать, есть ли другие подходы, которые могут работать? Я еще не рассматривал ctypes.

+0

Я фактически использую 'struct.unpack' с большими двоичными файлами и не имел проблем с реальной скоростью. Вы пытались использовать PyPy? Я думаю, поскольку 'struct.unpack' использует простые типы, он должен быть очень оптимизирован с помощью PyPy', поэтому он может дать вам необходимую скорость. – tamasgal

+0

@septi моя основная реализация Cython занимает 2 секунды по сравнению с struct.unpack в CPython, занимая 76s и pypy 26s – stgtscc

ответ

0

Вы действительно уверены, что копирование является проблемой? Что-то вроде этого уже слишком медленно для вас?

st = struct.Struct('>QLB') # whatever 
while True: 
    data = fp.read(st.size) 
    if not data: 
     break 
    a, b, c = st.unpack(data) 
    do_something_with(a, b, c) 

Если это так, возможно, с помощью ММАП и struct.unpack_from вы можете получить немного больше скорости.

Смежные вопросы