5

我正在为事件日志开发一个纯 Python 文件解析器,其大小可能从千字节到千兆字节不等。是否有一个模块可以将显式 // 调用抽象.open()为一个简单的类似缓冲区的对象.seek()?您可能会认为这是 的倒数。我希望它可能看起来像:.read().close()StringIO

with FileBackedBuffer('/my/favorite/path', 'rb') as buf:
    header = buf[0:0x10]
    footer = buf[0x10000000:]

mmap模块可以满足我的要求;但是,我有两个保留意见,希望得到反馈:

  1. 模块处理大于可用 RAM/swap 的文件很重要。我不确定是否mmap可以很好地做到这一点。
  2. mmap构造函数因操作系统而异。这让我犹豫不决,因为我正在寻找编写出色的跨平台代码,并且不想在操作系统细节上搞砸。如果需要,我会这样做,但这引发了我可能找错地方的警告。

如果mmap是诸如任务的正确模块,它如何处理这两点?如果不是,什么是合适的模块?

4

1 回答 1

5

mmap 可以轻松处理大于 RAM/swap 的文件。mmap 不能处理大于地址空间的文件,这意味着 32 位系统在他们可以使用多大的文件方面受到限制。

发生的情况mmap是操作系统在内存中只会有它选择的尽可能多的数据,但你的程序会认为它就在那里。但请注意使用模式,因为如果您的数据不适合 RAM 并且您跳得太随意,它将交换(丢弃您最近未使用的文件中的页面,以便为要加载的新页面腾出空间) .

如果您不需要指定任何 basefilenolength,我认为您无需担心mmap. 如果您确实需要担心额外的参数,那么您要么必须掌握 Windows 与 Unix,要么将其传递给您的用户。我不知道您的库将是什么,但在两个平台上提供合理的默认值同时还允许用户调整选项可能会很好。在我看来,您不太可能关心 Windowstagname选项,此外,如果您是跨平台的,那么只需接受 Unix 默认值,prot因为您在 Windows 上别无选择。只剩下关心MAP_PRIVATEMAP_SHARED。默认是MAP_SHARED,但我不确定这是否是最接近 Windows 行为的选项,但在那里接受默认值可能没问题。

于 2012-12-24T05:31:03.840 回答