2011-06-09 99 views
5

我覺得我有與here描述的相反的問題。我有一個進程將數據寫入日誌,我希望第二個進程讀取它,但我不希望第二個進程能夠修改內容。這可能是一個大文件,我需要隨機訪問,所以我使用python的mmap模塊。Python mmap ctypes - 只讀

如果我將mmap創建爲讀/寫(對於第二個進程),那麼使用from_buffer創建ctypes對象作爲mmap對象的「視圖」是沒有問題的。粗略看一下c代碼,看起來這是一個演員,而不是副本,這正是我想要的。但是,如果我使用mmap ACCESS_READ,則拋出一個from_buffer需要寫入權限的異常。

認爲我想用ctypes的FROM_ADDRESS()方法來代替,這似乎並不需要寫訪問。我可能錯過了一些簡單的東西,但我不確定如何獲取mmap中位置的地址。我知道我可以使用ACCESS_COPY(所以寫入操作在內存中顯示,但不保存到磁盤),但我寧願保持只讀。

有什麼建議嗎?

+0

如果您使用python mmap模塊,爲什麼需要創建ctypes對象? – tMC 2011-06-09 14:44:55

+0

日誌不僅僅是文本,它包括我已經映射到ctypes Structure類的數據結構。所以我會將內存映射到各種結構類型,並使用它來訪問子元素並決定如何處理日誌的不同部分。 – 2011-06-09 14:59:55

回答

0

好的,從查看mmap .c代碼,我不相信它支持這種用例。另外,我發現性能非常糟糕 - 對我的用例而言。我很好奇別人看到的是什麼樣的表現,但是我發現用Python處理500 MB的二進制文件需要大約40秒。這是創建一個mmap,然後使用from_buffer()將該位置轉換爲一個ctype對象,並使用ctypes對象來解密該對象的大小,以便我可以進入下一個對象。我試圖直接在msvc的C++中做同樣的事情。顯然,在這裏我可以直接投射到正確類型的對象上,並且速度很快 - 不到一秒(這是一個核心2 quad和ssd)。

我沒有發現我能得到具有以下

firstHeader = CEL_HEADER.from_buffer(map, 0) #CEL_HEADER is a ctypes Structure 
pHeader = pointer(firstHeader) 
#Now I can use pHeader[ind] to get a CEL_HEADER object 
#at an arbitrary point in the file 

指針此不圍繞原來的問題得到 - 保留mmap不是隻讀的,因爲我還需要使用from_buffer爲第一個電話。在這個配置中,處理整個文件仍需要大約40秒,所以看起來像從指針到ctypes結構的轉換正在消除性能。這只是一個猜測,但我沒有看到進一步追蹤它的價值。

我不確定我的計劃是否會幫助其他人,但我會嘗試根據mmap代碼創建一個特定於我的需求的c模塊。我想我可以使用快速的C代碼處理來索引二進制文件,然後通過調用ctypes/python對象一次只展示文件的一小部分。祝我好運。另外,作爲備註,Python 2.7.2今天(6/12/11)發佈,其中一項更改是對mmap代碼的更新,以便您可以使用python long來設置文件抵消。這使您可以在32位系統上對4GB以上的文件使用mmap。請參閱問題#4681 here

0

我遇到了類似的問題(無法設置只讀mmap),但我只使用python mmap模塊。 Python mmap 'Permission denied' on Linux

我不確定它對您有什麼幫助,因爲您不希望mmap是私人的嗎?

+0

我通過mmap打開和訪問文件沒有任何問題。問題是,如果緩衝區不可寫,from_buffer()會拋出一個異常,所以我需要另一個調用。 – 2011-06-09 15:17:17