我在C中有一个内核模块,它连续读取光电二极管中的数据,并将这些值与当前时间一起写入内存映射文件。从用户空间中的C程序,我可以从内核访问数据。我试图通过mmap功能在Python中做同样的事情。但是,当我尝试mmap文件时,我得到的错误就像" mmap长度大于文件大小"或" mmap文件为空"。看来Python无法从C访问mmaped文件,这是正确的吗?最后,我需要一个光滑二极管数据的numpy数组进行进一步处理。
有关内核数据结构的详细信息: mmap包含一个结构,其中包含最新电压值的索引和一个包含电压和时间的结构数组。内核有一个大的struct数组,并将光电二极管数据以页面大小的块写入struct数组。然后,C用户空间程序读取每个块以进行进一步处理。
用于读取mmaped C文件的Python代码:
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扩展使用python中已有的和可用的C代码。因此,python调用C并移交一个numpy数组,C将数据写入其中。这是最快的方式吗?其他建议?
答案 0 :(得分:0)
为了使它正常工作,我通过Python的Cython使用C代码。