Python,ctypes和mmap

时间:2010-09-03 22:51:42

标签: python ctypes

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

目前,我的模块分配一个缓冲区(create_string_buffer),然后使用byref将其传递给我的库mylib.read函数。顾名思义,这将数据读入缓冲区。然后我调用file.write(buf.raw)将数据写入磁盘。然而,我的基准测试显示这远远不是最优的(file.write花费的时间是mylib.read)花费的时间。

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

2 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:1)

请注意,无论如何操作系统都会为read()做一次预读。你将在read()或write()中阻塞 - 一个或另一个会阻塞操作 - 但即使你在一个阻塞,这并不意味着另一个没有发生在幕后为你服务。这是每个多任务操作系统的工作。

如果您使用mmap,那么很可能会让操作系统变得更复杂 - 这使得它更难以确定您实际上只是将数据流入和流出,并使其变得更加复杂做预读。它仍然可以解决(操作系统非常擅长),但你可能没有帮助。

原则上唯一的好处是避免了内存复制的成本,但这听起来不像是你的目标(除非分析清楚地说明,否则,我强烈怀疑这会有助于提高性能)。