Python mmap ctypes - 只读

Bre*_*yer 6 python ctypes mmap

我想我有与此处描述的相反的问题.我有一个进程将数据写入日志,我想要第二个进程来读取它,但我不希望第二个进程能够修改内容.这可能是一个大文件,我需要随机访问,所以我使用的是python的mmap模块.

如果我将mmap创建为读/写(对于第二个进程),我可以使用from_buffer将ctypes对象创建为mmap对象的"视图".从粗略看一下c代码,看起来这是一个演员,而不是副本,这就是我想要的.但是,如果我创建了mmap ACCESS_READ,则会中断,抛出from_buffer需要写权限的异常.

我想我想使用ctypes from_address()方法,它似乎不需要写访问权限.我可能遗漏了一些简单的东西,但我不确定如何在mmap中获取该位置的地址.我知道我可以使用ACCESS_COPY(因此写操作会显示在内存中,但不会持久保存到磁盘上),但我宁愿保持只读.

有什么建议?

Bre*_*yer 1

好吧,从查看 mmap .c 代码来看,我不相信它支持这个用例。另外,我发现对于我的用例来说,性能非常糟糕。我很好奇其他人会看到什么样的性能,但我发现用 Python 遍历一个 500 MB 的二进制文件大约需要 40 秒。这是创建一个 mmap,然后使用 from_buffer() 将位置转换为 ctype 对象,并使用 ctypes 对象来破译该对象的大小,以便我可以进入下一个对象。我尝试直接在 msvc 的 c++ 中做同样的事情。显然,在这里我可以直接转换为正确类型的对象,而且速度很快 - 不到一秒(这是使用 core 2 四核和 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
Run Code Online (Sandbox Code Playgroud)

这并没有解决最初的问题 - mmap 不是只读的,因为我仍然需要在第一次调用时使用 from_buffer 。在此配置中,处理整个文件仍然需要大约 40 秒,因此看起来从指针到 ctypes 结构的转换正在降低性能。这只是一个猜测,但我认为进一步追踪它没有多大价值。

我不确定我的计划是否对其他人有帮助,但我将尝试根据 mmap 代码创建特定于我的需求的 ac 模块。我想我可以使用快速 C 代码处理来索引二进制文件,然后通过调用 ctypes/python 对象一次仅公开文件的一小部分。祝我好运。

另外,作为旁注,Python 2.7.2 今天发布(2011 年 6 月 12 日),其中一项更改是对 mmap 代码的更新,以便您可以使用 python long 来设置文件偏移量。这使您可以在 32 位系统上对超过 4GB 的文件使用 mmap。请参阅此处的问题 #4681