2015-01-28 5 views
3

10 개 정도의 C 구조체가 혼합 된 수십 개의 파일이 있습니다. 분석을 위해 파일의 각 구조체를 반복 할 수 있어야하고 파이썬 코드에서이 분석을 수행 할 수 있어야합니다. 나는 파일에 전혀 쓸 필요가 없다.파이썬에서 큰 바이너리 파일을 구문 분석하는 가장 빠른 방법

파일이 단순 반복 구조체가 아니기 때문에 numpy가 도움이 될 것이라고 생각하지 않습니다. struct.unpack 내가 너무 느리다는 것을 알게된다.

내 아이디어는 Cython을 사용하고 파일을 mmap 한 다음 불필요한 복사를 피하기 위해 반복하여 Cython C 구조체에 버퍼를 캐스팅하는 것입니다. 비록 내가이 접근법에 부딪혔다 고해도, Cython C 구조체 포인터를 직접 사용할 수없고, 파이썬 래퍼 클래스를 효과적으로 작성해야 쓰기가 더 느리고 지겨워진다. 누구든지이 문제를 해결할 방법을 알고 있습니까?

다른 접근 방식이 효과가 있을지 궁금한가요? 나는 ctypes를 아직 고려하지 않았다.

+0

실제로 큰 이진 파일과 함께'struct.unpack'을 사용하고 실제 속도 문제가 없습니다. PyPy를 사용해 보셨습니까? 제 생각에는'struct.unpack'은 단순한 타입을 사용하기 때문에'PyPy'에 의해 매우 최적화되어야합니다. 그래서 당신에게 필요한 속도 향상을 줄 수 있습니다. – tamasgal

+0

@septi 내 기본 Cython 구현은 76 초 및 pypy 26s 복용 CPython struct.unpack에 비해 2 초 걸립니다 – 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) 

그렇다면 mmap 및 struct.unpack_from을 사용하면 속도가 더 빨라질 수 있습니다.

관련 문제