Python将文件映射到内存使用mmap.mmap()函数方式

 更新时间:2024年02月10日 09:57:52   作者: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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python 如何利用ffmpeg 处理视频素材

    Python 如何利用ffmpeg 处理视频素材

    ffmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序,使用这个神器,便可以处理各种视频素材内容,极度舒适。本文将介绍如何利用ffmpeg对视频素材进行处理,感兴趣的可以了解一下
    2021-11-11
  • 在win和Linux系统中python命令行运行的不同

    在win和Linux系统中python命令行运行的不同

    本文给大家分享的是作者在在win和Linux系统中python命令行运行的不同的解决方法,有相同需求的小伙伴可以参考下
    2016-07-07
  • python GUI库图形界面开发之PyQt5滑块条控件QSlider详细使用方法与实例

    python GUI库图形界面开发之PyQt5滑块条控件QSlider详细使用方法与实例

    这篇文章主要介绍了python GUI库图形界面开发之PyQt5滑块条控件QSlider详细使用方法与实例,需要的朋友可以参考下
    2020-02-02
  • Python文件操作JSON CSV TSV Excel和Pickle文件序列化

    Python文件操作JSON CSV TSV Excel和Pickle文件序列化

    这篇文章主要为大家介绍了Python文件操作之JSON、CSV、TSV、Excel和Pickle文件序列化示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • 4行Python代码生成图像验证码(2种)

    4行Python代码生成图像验证码(2种)

    这篇文章主要介绍了4行Python代码生成图像验证码(2种),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • 如何用VScode配置Python开发环境

    如何用VScode配置Python开发环境

    这篇文章主要介绍了如何用VScode配置Python开发环境,vscode有很多优点,用VScode来编写Python,也是相当的好用的,需要的朋友可以参考下
    2023-03-03
  • Python装饰器超详细实例教程

    Python装饰器超详细实例教程

    本文介绍了Python装饰器的基本概念、用途和实现方法,装饰器是一种在不修改原函数代码的前提下,为函数动态添加功能的工具,其本质是闭包和高阶函数,装饰器可用于日志记录、计时、权限校验等功能,感兴趣的朋友跟随小编一起看看吧
    2026-05-05
  • 深入理解python虚拟机如何实现闭包

    深入理解python虚拟机如何实现闭包

    当能够从设计者的层面去理解闭包就再也不用死记硬背一些闭包的概念了,所以本文就来从虚拟机层面和大家一起讨论函数闭包是如何实现的
    2023-10-10
  • 简单了解OpenCV是个什么东西

    简单了解OpenCV是个什么东西

    这篇文章主要介绍了简单了解OpenCV是什么,结合了几篇相关文章的介绍,还是比较不错的,希望大家在阅读过之后,会对OpenCV有一个简单了解。
    2017-11-11
  • pyqt5-tools安装失败的详细处理方法

    pyqt5-tools安装失败的详细处理方法

    最近在工作中遇到一个问题,python pyqt5在安装的时候居然提示失败了,无奈只能找解决的办法,这篇文章主要给大家介绍了关于pyqt5-tools安装失败的详细处理方法,需要的朋友可以参考下
    2022-05-05

最新评论