【发布时间】:2018-05-07 03:56:10
【问题描述】:
我有一个 C 中的内核模块,它连续地从光电二极管读取数据,并将值与当前时间一起写入内存映射文件。我可以从用户空间中的 C 程序访问内核中的数据。我尝试通过 mmap 功能在 Python 中做同样的事情。但是,当我尝试对文件进行 mmap 映射时,会出现“mmap 长度大于文件大小”或“mmap 文件为空”之类的错误。似乎 Python 无法从 C 访问 mmaped 文件,对吗?最后,我需要一个光电二极管数据的 numpy 数组以进行进一步处理。
关于内核数据结构的详细信息: mmap 包含一个带有最新电压值索引的结构体和一个带有电压和时间的结构体数组。内核有一个大的结构数组,并将光电二极管数据以页面大小的块写入结构数组。然后 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 将数据写入其中。这是最快的方法吗?其他建议?
【问题讨论】:
标签: python c numpy kernel mmap