2010-09-03 55 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