Python使用mmap实现内存映射文件操作

 更新时间:2021年06月07日 10:31:57   作者:一天一篇Python库  
内存映射通常可以提高I/O的性能,本文主要介绍了Python使用mmap实现内存映射文件操作,分享给大家,感兴趣的可以了解一下

前言

内存映射通常可以提高I/O的性能,因为使用内存映射时,不需要对每个访问都建立一个单独的系统调用,也不需要在缓冲区之间复制数据,内核和用户都能很方便的直接访问内存。

说明

 1)什么叫映射?

   ==>就是给一个对象(可以是变量、物理等),起一个唯一的别名,建立一一对应的关系;

 2)文件映射:将磁盘上的文件的位置,与进程逻辑地址空间中一块大小相同的区域之间的一一对应;

 3)映射后得到一个类似数组类型的东西(mmap.mmap()对象),可以通过类似操作数组的方式,达到对文件内容更改的目的;

优点

 1)相对于二进制文件的缺陷
  通常读写文件时,使用read()和write()方法,这两种方法都是以流的形式进行的,也就是一个字节接着一个字节的读写;如果想从某一位置开始读写,使用seek()方法调整文件指针,此方法对二进制文件的操作非常不方便,因为相对于二进制文件,数据写入文件时是以数组的形式,将数据映射到文件内,然后就以访问数组的形式访问文件,而且在对文件进行修改后,能再次通过此数组将数据同步到文件中;

 2)某些嵌入式设备,寄存器被编址到内存地址空间,我们可以映射/dev/mem某范围,取访问这些寄存器
  例如:在树莓派(为学习计算机编程教育设计的一种微型电脑)上,有一个pwm波形的发生器,若想使用此发生器,就要访问树莓派的寄存器;实际上,寄存器就是物理地址的某一特定空间;此时,如果要访问寄存器,需要将 /dev/mem 的某一范围,映射到内存中,用访问内存的方式来访问寄存器;

 3)如果多个进程映射同一个文件,还能实现进程通信的目的
  多个进程把同一个文件映射到各自的内存空间当中,实际上它们看到的是同一个视图,也能实现进程通信的目的; 

本篇,将详细介绍Python内存映射库:mmap。

mmap(读文件)

使用mmap()函数可以创建一个内存映射文件。该函数的第1个参数是一个文件描述符,可以通过file对象的fileno()函数获取;第2个参数是要映射的文件部分大小(单位字节),如果该值为0,映射整个文件,如果该参数大于文件大小,则扩展该文件。

示例如下:

import mmap

with open('英文文档.txt','r') as f:
    with mmap.mmap(f.fileno(),0,access=mmap.ACCESS_READ) as m:
        print(m.read(10))
        print(m.read(10))
        print(m[:-10])

运行之后,效果如下:

输出

这里读写会根据文件指针进行移动,比如开始读10个字符,那么第2次读就会接着11个字符开始在读,不会返回起点,而通过切片或者seek()函数可以将指针重置。

至于access参数,表示以什么方式访问,这里以读的方式。

需要特别注意的是,windows不支持创建长度为0的映射。

write(写文件)

写文件比较简单,这里我们直接看一段代码:

import mmap

word = b'The'

with open('英文文档.txt', 'r+') as f:
    with mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_WRITE) as m:
        loc = m.find(word)
        m[loc:loc + len(word)] = b'lyj'
        print(m.read())

运行之后,首字母The,就被我们替换成"lyj"了,效果如下:

追加

当然,这里除了切片写入之外,也可以使用write()等文件操作方法进行操作,与文件操作一样。需要注意的是假如access等于ACCESS_COPY,那么不会把修改的内容写入磁盘上的文件。

到此这篇关于Python使用mmap实现内存映射文件操作的文章就介绍到这了,更多相关Python 内存映射文件操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python 3.x基于Xml数据的Http请求方法

    Python 3.x基于Xml数据的Http请求方法

    今天小编就为大家分享一篇Python 3.x基于Xml数据的Http请求方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • Pytorch训练过程出现nan的解决方式

    Pytorch训练过程出现nan的解决方式

    今天小编就为大家分享一篇Pytorch训练过程出现nan的解决方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • PyTorch环境配置及安装过程

    PyTorch环境配置及安装过程

    这篇文章主要介绍了PyTorch环境配置及安装,本文通过图文实例代码相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • Python Web程序部署到Ubuntu服务器上的方法

    Python Web程序部署到Ubuntu服务器上的方法

    在本文记录了我在Ubuntu中部署Flask Web站点的过程, 其中包括用户创建、代码获取、Python3环境的安装、虚拟环境设置、uWSGI启动程序设置,并将Nginx作为前端反向代理,需要的朋友参考下吧
    2018-02-02
  • Django静态文件加载失败解决方案

    Django静态文件加载失败解决方案

    这篇文章主要介绍了Django静态文件加载失败解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • 如何在python中实现线性回归

    如何在python中实现线性回归

    这篇文章主要介绍了如何在python中实现线性回归,帮助大家更好的理解和学习Python,感兴趣的朋友可以了解下
    2020-08-08
  • python使用urllib模块开发的多线程豆瓣小站mp3下载器

    python使用urllib模块开发的多线程豆瓣小站mp3下载器

    对豆瓣音乐小站页面html分析出所有mp3(正则匹配)文件url,然后用urllib.urlretrieve中方法直接将文件下载到本地,通过多线程技术下载
    2014-01-01
  • Django中自定义模型管理器(Manager)及方法

    Django中自定义模型管理器(Manager)及方法

    这篇文章主要介绍了Django中自定义模型管理器(Manager)及方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • Python如何识别银行卡卡号?

    Python如何识别银行卡卡号?

    今天给大家带来的是有关Python的相关知识,文章围绕着Python如何识别银行卡卡号展开,文中有非常详细的代码示例及介绍,需要的朋友可以参考下
    2021-06-06
  • Python基于DES算法加密解密实例

    Python基于DES算法加密解密实例

    这篇文章主要介绍了Python基于DES算法加密解密实现方法,以实例形式分析了DES算法实现加密解密的相关技巧,需要的朋友可以参考下
    2015-06-06

最新评论