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

Wil*_*hin 5 python

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

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

mmap模块可满足我的要求; 但是,我有两个保留意见,我会感谢您的反馈意见:

  1. 重要的是模块处理大于可用RAM/swap的文件.我不确定mmap能否做到这一点.
  2. mmap构造取决于OS是不同的.这让我犹豫不决,因为我正在寻找编写漂亮的跨平台代码,而不想在操作系统细节中捣乱.如果我需要,我会这样做,但是这引发了一个警告,我可能会在错误的地方寻找.

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

Jos*_*oyd 5

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

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

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