2010-09-03 88 views
8

我想知道ctypes包是否可以与mmap进行接口。Python,ctypes和mmap

目前,我的模块分配一个缓冲区(与create_string_buffer),然后通过使用byref到我的库mylib.read函数。顾名思义,这就是将数据读入缓冲区。然后我拨打file.write(buf.raw)将数据写入磁盘。然而,我的基准测试表明,这远没有达到最佳效果(在file.write中花费的时间在mylib.read中花费的时间更好)。

因此,我很想知道ctypes是否可以与mmap进行互操作。给定一个mmap.mmap实例和一个偏移量,我怎样才能得到一个指针(c_void_p)到地址空间?

+0

Python有一个[mmap](http://docs.python.org/library/mmap.html)模块。 – Seth 2010-09-03 23:05:39

+1

@我指的'mmap.mmap'实例来自该模块。我想知道它的实例如何与ctypes进行交互。 – 2010-09-03 23:23:50

+0

你确定你应该用Python做这个吗?低级指针杂耍更适合C或其他流派。编写C模块来与Python很好地接口也不难。 – katrielalex 2010-09-04 00:01:44

回答

10

mmap对象“支持读写缓存界面”,因此你可以使用from_buffer类方法,而这一切​​类有,与mmap实例作为论据,来创建一个​​对象就像你想要的,即,共享实例映射的内存(以及底层文件)。我想,具体来说,你会想要一个合适的​​array

+0

一个很好的例子:https://github.com/serdardalgic/Code_Snippets/blob/master/Python-Examples/mmap/shared_memory_write.py – 2015-01-09 23:14:05

1

请注意,无论如何,操作系统将会对read()进行readahead。你将在read()或write()中阻塞 - 其中一个或另一个会阻止操作 - 但即使你阻塞在一个中,这并不意味着另一个不会发生为你在幕后。这是每个多任务操作系统的工作。

如果你为此使用mmap,你很可能会使操作系统变得更加复杂 - 使它更难以确定你真的只是流入和流出数据,并且使它更加复杂它做预读。它仍然可以解决它(操作系统非常擅长),但你可能没有帮助。

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

+1

mylibrary.read()与连接的1394设备接口,此时系统I/O总线完全空闲。在提问之前,我对原始C和基准mmap进行了基于read()/ write()的入侵检测。 mmap快了50%。 – 2010-09-04 09:51:37