나는 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는 그 데이터를 그 안에 기록합니다. 그게 가장 빠르지? 기타 추천?