Python将文件映射到内存使用mmap.mmap()函数方式
作者:AllardZhao
这篇文章主要介绍了Python将文件映射到内存使用mmap.mmap()函数方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
如何将文件映射到内存
实际案例
(1)在访问某些二进制文件时,希望能把文件映射到内存中,可以实现随机访问。(framebuffer设备文件)
(2)某些嵌入式设备,寄存器被编址到内存地址空间,我们可以映射/dev/mem某范围,去访问这些寄存器。
(3)如果多个进程映射同一个文件,还能实现进程通信的目的。
解决方案
使用标准库中mmap模块的mmap()函数,它需要一个打开的文件描述作为参数。
代码演示
# 使用dd命令创建大小为1M的,每个字节都是0的二进制文件demo.bin ~ % dd if=/dev/zero of=demo.bin bs=1024 count=1024 1024+0 records in 1024+0 records out 1048576 bytes transferred in 0.008838 secs (118644037 bytes/sec) # 以16进制形式查看这个文件 ~ % od -x demo.bin 0000000 0000 0000 0000 0000 0000 0000 0000 0000 * 4000000 # 接下来对这个文件进行映射
import mmap ''' mmap.mmap函数介绍: 需要注意对于不同的平台对这个函数使用稍有差别。 Windows: mmap(fileno, length[, tagname[, access[, offset]]]) Unix: mmap(fileno, length[, flags[, prot[, access[, offset]]]]) fileno为文件描述符,并不是一个文件对象,文件描述符是由系统调用的open函数得到的, 系统调用的open函数在os.open(),也可以使用python的open函数 offset为指定映射区域,必须以页对齐的 ''' # b为二进制模式,r+为读写权限 f = open('demo.bin', 'r+b') # 得到文件描述符 print(f.fileno()) # 做映射,映射区域长度为0映射整个文件,访问权限写 mn = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_WRITE) # m为mmap对象类似于数组一样的操作 print(type(mn)) print(mn[0]) print(mn[10:20]) # 对文件进行写操作 mn[0] = 88 # 字符串长度和切片长度保持一致 mn[4:8] = b'\xff' * 4 # 设置offset跳过4个页,并且映射8个页 mn2 = mmap.mmap(f.fileno(), mmap.PAGESIZE * 8, access=mmap.ACCESS_WRITE, offset=mmap.PAGESIZE * 4) # 对切片进行修改 mn2[:0x1000] = b'\xaa' * 0x1000
修改文件映射内存的内容并查看 # 修改映射地址内容 # 查看[0]、[4:8]和[:0x1000]内容修改 ~ % od -x demo.bin 0000000 0058 0000 ffff ffff 0000 0000 0000 0000 0000020 0000 0000 0000 0000 0000 0000 0000 0000 * 0040000 aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa * 0050000 0000 0000 0000 0000 0000 0000 0000 0000 * 4000000
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。