2011-06-09 94 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