我想知道ctypes包是否可以与mmap连接。
目前,我的模块分配一个缓冲区(create_string_buffer
),然后使用byref
将其传递给我的库mylib.read
函数。顾名思义,这将数据读入缓冲区。然后我调用file.write(buf.raw)
将数据写入磁盘。然而,我的基准测试显示这远远不是最优的(file.write
花费的时间是mylib.read
)花费的时间。
因此,我很想知道ctypes是否可以与mmap互操作。给定mmap.mmap
实例和偏移量,如何将指针(c_void_p
)放入地址空间?
答案 0 :(得分:12)
mmap
对象“支持可写缓冲区接口”,因此您可以使用from_buffer类,所有ctypes
类具有mmap
实例作为参数,创建一个ctypes
对象,就像你想要的那样,即共享mmap
实例映射的内存(以及底层文件)。我想,具体而言,您需要一个合适的ctypes
array。
答案 1 :(得分:1)
请注意,无论如何操作系统都会为read()做一次预读。你将在read()或write()中阻塞 - 一个或另一个会阻塞操作 - 但即使你在一个阻塞,这并不意味着另一个没有发生在幕后为你服务。这是每个多任务操作系统的工作。
如果您使用mmap,那么很可能会让操作系统变得更复杂 - 这使得它更难以确定您实际上只是将数据流入和流出,并使其变得更加复杂做预读。它仍然可以解决(操作系统非常擅长),但你可能没有帮助。
原则上唯一的好处是避免了内存复制的成本,但这听起来不像是你的目标(除非分析清楚地说明,否则,我强烈怀疑这会有助于提高性能)。