2017-11-23 4 views
2

나는 photiodiode로부터 연속적으로 데이터를 읽고 현재 시간과 함께 값을 메모리 매핑 파일에 기록하는 C 커널 모듈을 가지고있다. 사용자 공간에있는 C 프로그램에서 커널의 데이터에 액세스 할 수 있습니다. 나는 mmap 기능을 통해 파이썬에서 같은 것을 시도했다. 그러나 파일을 mmap하려고하면 "mmap 길이가 파일 크기보다 큽니다."또는 "mmap file is empty"와 같은 오류가 발생합니다. 그것은 파이썬 C에서 mmaped 파일에 액세스 할 수없는 것, 맞습니까? 결국, 나는 더 많은 처리를 위해 포토 다이오드 데이터의 질적 인 배열이 필요하다.공유 커널 메모리에 접근하기위한 Python mmap

커널 데이터 구조에 대한 세부 정보 : mmap에는 최신 전압 값에 대한 인덱스가있는 구조체와 전압 및 시간과 구조체 배열이 있습니다. 커널은 하나의 커다란 구조체 배열을 가지고 있으며 페이지 크기의 청크 (chunk)에있는 포토 다이오드 데이터를 구조체 배열에 씁니다. C 사용자 공간 프로그램은 더 많은 처리를 위해 각 청크를 읽는다.

파이썬 코드는 mmaped C 파일을 읽을 수 :

num_pages = 103 
page_size = 10000 
max_buffer_size = num_pages * page_size 

class buf_element(ctypes.Structure): 

    _fields_ = [("voltage", ctypes.c_int), 
     ("time", ctypes.c_uint)] 

class data(ctypes.Structure): 

    _fields_ = [("latest_page_offset", ctypes.c_int), 
       ("buffer", ctypes.POINTER(buf_element))] 

length_data = ctypes.sizeof(ctypes.c_int) + max_buffer_size * ctypes.sizeof(buf_element); 
fd = os.open(data_file, os.O_RDWR) 
buf = mmap.mmap(fd, length_data, mmap.MAP_SHARED, mmap.PROT_READ) 
test_data = data.from_buffer(buf) 
print test_data.latest_page_offset 
os.close(fd) 

내 생각은 C 확장을 통해 파이썬에서 이미 기존의 작업 C 코드를 사용하는 것이 었습니다. 그래서, 파이썬은 C를 호출하고 질적 인 배열을 넘겨주고 C는 그 데이터를 그 안에 기록합니다. 그게 가장 빠르지? 기타 추천?

답변

0

파이썬에서 Cython을 통해 C 코드를 사용합니다.

관련 문제