빠른 액세스를 위해 C 배열에로드하려는 큰 바이너리 데이터 파일이 있습니다. 데이터 파일에는 4 바이트 int 시퀀스가 포함됩니다.바이너리 문자열을 int 배열로 변환하는 Cython 빠른 변환
이진 문자열을 반환하는 pkgutil.get_data 함수를 통해 데이터를 가져옵니다. 다음 코드는 작동 :
import pkgutil
import struct
cdef int data[32487834]
def load_data():
global data
py_data = pkgutil.get_data('my_module', 'my_data')
for i in range(32487834):
data[i] = <int>struct.unpack('i', py_data[4*i:4*(i+1)])[0]
return 0
load_data()
문제는이 코드가 매우 느린 것입니다. 전체 데이터 파일을 읽는 데 7 ~ 8 초가 걸릴 수 있습니다. C에서 배열로 직접 파일을 읽는 데는 1-2 초가 걸리지 만 pkgutil.get_data를 사용하여 모듈이 설치 될 때마다 데이터를 안정적으로 찾을 수 있습니다.
제 질문은 이렇게하는 것입니다.이 작업을 수행하는 가장 좋은 방법은 무엇입니까? struct.unpack에 대한 호출없이 int 배열로 데이터를 직접 캐스팅 할 수 있습니까? 그리고 2 차 질문으로 120MB의 데이터를 불필요하게 복사하지 않도록 데이터에 대한 포인터를 얻는 방법이 있습니까?
또는, 나는 매우 빠르게 파일을 읽을 C 파일 IO를 사용할 수있는 경우 대신 데이터 자체의 데이터에 대한 파일 경로를 (반환 pkgutil 만들 수있는 방법이
편집 :.
그냥 레코드에 대한은 여기 (Veedrac의 답변에 따라)에 사용되는 최종 코드를 다음과 같습니다.
import pkgutil
from cpython cimport array
import array
cdef int[:] data
cdef void load_data():
global data
py_data = pkgutil.get_data('my_module', 'my_data')
data = array.array('i', py_data)
load_data()
모든 것이 아주 빠르게
그냥 메모리 맵이 아닌가? –