Python、ctypes和mmap

Python、ctypes和mmap,python,ctypes,Python,Ctypes,我想知道ctypes包是否可以与mmap接口 当前,我的模块分配一个缓冲区(使用create\u string\u buffer),然后使用byref将该缓冲区传递给我的库mylib.read函数。顾名思义,它将数据读入缓冲区。然后我调用file.write(buf.raw)将数据写入磁盘。然而,我的基准测试表明,这远远不是最优的(花在文件中的时间。write比花在mylib.read上的时间更好) 因此,我很想知道ctypes是否可以与mmap进行互操作。给定mmap.mmap实例和偏移量,如

我想知道ctypes包是否可以与mmap接口

当前,我的模块分配一个缓冲区(使用
create\u string\u buffer
),然后使用
byref
将该缓冲区传递给我的库
mylib.read
函数。顾名思义,它将数据读入缓冲区。然后我调用
file.write(buf.raw)
将数据写入磁盘。然而,我的基准测试表明,这远远不是最优的(花在
文件中的时间。write
比花在
mylib.read
上的时间更好)


因此,我很想知道ctypes是否可以与mmap进行互操作。给定
mmap.mmap
实例和偏移量,如何将指针(
c\u void\u p
)放入地址空间?

请注意,操作系统无论如何都将执行readahead for read()。您将在read()或write()中阻塞—其中一个将使操作瓶颈化—但即使您在其中一个中阻塞,这并不意味着另一个不会在幕后发生。这是每个多任务操作系统的工作

如果你使用mmap来实现这一点,你很可能会让操作系统变得更复杂——让它更难确定你实际上只是在流式传输数据,让它更复杂地进行预读。它可能仍然能够解决这个问题(操作系统在这方面非常出色),但您可能帮不上忙


原则上,唯一的好处是避免了内存拷贝的成本,但这听起来并不是您的目标(除非分析明确指出,否则我强烈怀疑这会有助于提高性能)。

一个
mmap
对象“支持可写缓冲区接口”,因此您可以使用class方法,所有
ctypes
类都有,以
mmap
实例作为参数,创建一个
ctypes
对象,就像您想要的那样,即共享
mmap
实例映射的内存(以及底层文件)。我想,具体来说,您需要一个合适的
ctypes

Python有一个模块。@Seth我所指的
mmap.mmap
实例就是来自该模块的。我想知道它的实例如何与ctypes接口。你确定应该用Python来实现吗?低级指针杂耍更适合C或其同类。编写C模块与Python很好地接口也不难。对不起,误解了。我以为您正在尝试将自己的mmap interface.mylibrary.read()接口与已连接的1394设备结合,此时系统I/O总线完全空闲。在询问之前,我在原始C中破解了相同的循环,并根据read()/write()对mmap进行了基准测试。mmap快了约50%。这是一个很好的例子: