Python mmap 访问共享内核内存
Python mmap to access shared kernel memory
我有一个 C 语言的内核模块,它从光电二极管连续读取数据并将值与当前时间一起写入内存映射文件。从用户 space 中的 C 程序,我可以从内核访问数据。我试图通过 mmap 功能在 Python 中做同样的事情。但是,当我尝试映射文件时,出现 "mmap length is greater than file size" 或 "mmap file is empty" 之类的错误。似乎 Python 无法从 C 访问 mmaped 文件,对吗?最后,我需要一个 numpy 数组的光电二极管数据进行进一步处理。
关于内核数据结构的详细信息:
mmap 包含一个带有最新电压值索引的结构和一个带有电压和时间的结构数组。内核有一个大的结构数组,并将光电二极管数据以页面大小的块写入结构数组。 C 用户 space 程序读取每个块以进行进一步处理。
Python 读取 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 扩展使用来自 python 的已经存在且有效的 C 代码。因此,python 调用 C 并移交一个 numpy 数组,C 将数据写入其中。那是最快的方法吗?其他推荐?
为了让它工作,我通过 Cython 使用来自 Python 的 C 代码。
我有一个 C 语言的内核模块,它从光电二极管连续读取数据并将值与当前时间一起写入内存映射文件。从用户 space 中的 C 程序,我可以从内核访问数据。我试图通过 mmap 功能在 Python 中做同样的事情。但是,当我尝试映射文件时,出现 "mmap length is greater than file size" 或 "mmap file is empty" 之类的错误。似乎 Python 无法从 C 访问 mmaped 文件,对吗?最后,我需要一个 numpy 数组的光电二极管数据进行进一步处理。
关于内核数据结构的详细信息: mmap 包含一个带有最新电压值索引的结构和一个带有电压和时间的结构数组。内核有一个大的结构数组,并将光电二极管数据以页面大小的块写入结构数组。 C 用户 space 程序读取每个块以进行进一步处理。
Python 读取 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 扩展使用来自 python 的已经存在且有效的 C 代码。因此,python 调用 C 并移交一个 numpy 数组,C 将数据写入其中。那是最快的方法吗?其他推荐?
为了让它工作,我通过 Cython 使用来自 Python 的 C 代码。