开发者社区> 问答> 正文

内存映射的二进制文件

你想内存映射一个二进制文件到一个可变字节数组中,目的可能是为了随机访问它的内容或者是原地做些修改。

展开
收起
哦哦喔 2020-04-17 12:25:55 921 0
1 条回答
写回答
取消 提交回答
  • 使用 mmap 模块来内存映射文件。 下面是一个工具函数,向你演示了如何打开一个文件并以一种便捷方式内存映射这个文件。
    
    import os
    import mmap
    
    def memory_map(filename, access=mmap.ACCESS_WRITE):
        size = os.path.getsize(filename)
        fd = os.open(filename, os.O_RDWR)
        return mmap.mmap(fd, size, access=access)
    为了使用这个函数,你需要有一个已创建并且内容不为空的文件。 下面是一个例子,教你怎样初始创建一个文件并将其内容扩充到指定大小:
    
    >>> size = 1000000
    >>> with open('data', 'wb') as f:
    ...     f.seek(size-1)
    ...     f.write(b'\x00')
    ...
    >>>
    下面是一个利用 memory_map() 函数类内存映射文件内容的例子:
    
    >>> m = memory_map('data')
    >>> len(m)
    1000000
    >>> m[0:10]
    b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
    >>> m[0]
    0
    >>> # Reassign a slice
    >>> m[0:11] = b'Hello World'
    >>> m.close()
    
    >>> # Verify that changes were made
    >>> with open('data', 'rb') as f:
    ... print(f.read(11))
    ...
    b'Hello World'
    >>>
    mmap() 返回的 mmap 对象同样也可以作为一个上下文管理器来使用, 这时候底层的文件会被自动关闭。比如:
    
    >>> with memory_map('data') as m:
    ...     print(len(m))
    ...     print(m[0:10])
    ...
    1000000
    b'Hello World'
    >>> m.closed
    True
    >>>
    默认情况下, memeory_map() 函数打开的文件同时支持读和写操作。 任何的修改内容都会复制回原来的文件中。 如果需要只读的访问模式,可以给参数 access 赋值为 mmap.ACCESS_READ 。比如:
    
    m = memory_map(filename, mmap.ACCESS_READ)
    如果你想在本地修改数据,但是又不想将修改写回到原始文件中,可以使用 mmap.ACCESS_COPY :
    
    m = memory_map(filename, mmap.ACCESS_COPY)
    讨论
    
    2020-04-17 12:26:04
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
内存取证与IaaS云平台恶意行 为的安全监控 立即下载
云服务器ECS内存增强型实例re6全新发布 立即下载
低代码开发师(初级)实战教程 立即下载