Python中内存映射有什么用,映射文件操作是什么
Admin 2022-06-24 群英技术资讯 1078 次浏览
今天这篇我们来学习和了解“Python中内存映射有什么用,映射文件操作是什么”,下文的讲解详细,步骤过程清晰,对大家进一步学习和理解“Python中内存映射有什么用,映射文件操作是什么”有一定的帮助。有这方面学习需要的朋友就继续往下看吧!内存映射通常可以提高I/O的性能,因为使用内存映射时,不需要对每个访问都建立一个单独的系统调用,也不需要在缓冲区之间复制数据,内核和用户都能很方便的直接访问内存。
1)什么叫映射?
==>就是给一个对象(可以是变量、物理等),起一个唯一的别名,建立一一对应的关系;
2)文件映射:将磁盘上的文件的位置,与进程逻辑地址空间中一块大小相同的区域之间的一一对应;
3)映射后得到一个类似数组类型的东西(mmap.mmap()对象),可以通过类似操作数组的方式,达到对文件内容更改的目的;
1)相对于二进制文件的缺陷
通常读写文件时,使用read()和write()方法,这两种方法都是以流的形式进行的,也就是一个字节接着一个字节的读写;如果想从某一位置开始读写,使用seek()方法调整文件指针,此方法对二进制文件的操作非常不方便,因为相对于二进制文件,数据写入文件时是以数组的形式,将数据映射到文件内,然后就以访问数组的形式访问文件,而且在对文件进行修改后,能再次通过此数组将数据同步到文件中;
2)某些嵌入式设备,寄存器被编址到内存地址空间,我们可以映射/dev/mem某范围,取访问这些寄存器
例如:在树莓派(为学习计算机编程教育设计的一种微型电脑)上,有一个pwm波形的发生器,若想使用此发生器,就要访问树莓派的寄存器;实际上,寄存器就是物理地址的某一特定空间;此时,如果要访问寄存器,需要将 /dev/mem 的某一范围,映射到内存中,用访问内存的方式来访问寄存器;
3)如果多个进程映射同一个文件,还能实现进程通信的目的
多个进程把同一个文件映射到各自的内存空间当中,实际上它们看到的是同一个视图,也能实现进程通信的目的;
本篇,将详细介绍Python内存映射库: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的映射。
写文件比较简单,这里我们直接看一段代码:
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,那么不会把修改的内容写入磁盘上的文件。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了教你如何用python开发一款数字推盘小游戏,文中有非常详细的代码示例,喜对欢玩小游戏的或者正在学习python小游戏开发的小伙伴们有很好的帮助,需要的朋友可以参考下
这篇文章主要介绍了pandas读取excel时获取读取进度的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
参数化就是把测试过程中的数据提取出来,通过参数传递不同的数据来驱动用例运行,这篇文章主要给大家介绍了关于Python基础教程之pytest参数化的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
接触过其他语言的同学可能都知道算数运算符里面有个自增运算符++, 在写循环的时候非常常用, 但是Python里面可能会不同,需要引起大家注
这篇文章主要为大家详细介绍了Python利用Pygame模块实现简单打地鼠游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008