是否有一个Python模块用于透明地处理文件的内容作为缓冲区?

时间:2012-12-24 05:14:35

标签: python

我正在为事件日志开发一个纯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构造函数因操作系统而异。这让我犹豫不决,因为我正在寻找编写漂亮的跨平台代码,而不想在操作系统细节中捣乱。如果我需要的话,我会这样做,但这会引发警告,我可能会在错误的地方寻找。
  3. 如果mmap是任务的正确模块,它如何处理这两点?如果不是,那么适当的模块是什么?

1 个答案:

答案 0 :(得分:5)

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

mmap会发生什么,操作系统只会在内存中记录尽可能多的数据,但是程序会认为它就在那里。在使用模式中要小心,因为如果你的数据不适合RAM并且你随机跳转,它会交换(丢弃你最近没用过的文件页面,为新页面加载腾出空间)

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