美文网首页
内存映射的二进制文件(插入指定位置的制定数据)

内存映射的二进制文件(插入指定位置的制定数据)

作者: LittleBear_6c91 | 来源:发表于2019-05-09 20:39 被阅读0次

问题
你想内存映射一个二进制文件到一个可变字节数组中,目的可能是为了随机访问
它的内容或者是原地做些修改。
解决方案
使用 mmap 模块来内存映射文件。下面是一个工具函数,向你演示了如何打开一个
文件并以一种便捷方式内存映射这个文件。

>>> import mmap
>>> import os
>>> 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')

    
999999
1

下面是一个利用 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:11] = b'hello world'
>>> m.close()
>>> 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)

官方文档:https://docs.python.org/3/library/mmap.html

相关文章

  • 内存映射的二进制文件(插入指定位置的制定数据)

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

  • 类加载器

    类加载器类加载器负责装入类,搜索网络、jar、zip、文件夹、二进制数据、内存等指定位置的类资源。一个java程序...

  • STL—— set的使用

    1数据插入 1.1 insert插入数据 1.2 insert指定位置插入数据 插入数据总是认为成功,如果已经存在...

  • python高级编程技巧(8)

    一. 如何将文件映射到内存? 实际案例: 在访问某些二进制文件时。希望能把文件映射到内存中,可以实现随机访问。(f...

  • dirent,进程,僵尸

    在文件指定位置插入数据而不覆盖 测试文件是否存在(可读可写可执行) 判断文件类型(普通文件,目录文件) 1.进程的...

  • hex、bin、img

    bin和img都是原始二进制文件,放到内存指定位置可以直接运行, hex文件是使用ascii表示的具有一定格式的文...

  • Linux 进程间通信 -- 文件mmap映射

    Linux 进程间通信 -- 文件mmap映射 打开一个文件, 并且指定文件中的一个区域, 映射到内存中, 然后直...

  • 基于C++的通过内存映射实现进程间的数据交换

    VC++ 通过内存映射实现进程间的数据交换,创建内存映像对象,从内存映射对象读数据,将文件的视图映射到一个进程的地...

  • MongoDB如何存储数据

    Memeory-Mapped Files 内存映射文件是OS通过mmap在内存中创建一个数据文件,这样就把文件映射...

  • python列表

    insert 插入 在指定索引位置插入数据 append插入 •append是直接插入到末尾 extend •把列...

网友评论

      本文标题:内存映射的二进制文件(插入指定位置的制定数据)

      本文链接:https://www.haomeiwen.com/subject/upggoqtx.html