Python使用mmap实现内存映射文件操作
作者:一天一篇Python库 发布时间:2022-04-26 14:37:19
前言
内存映射通常可以提高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,那么不会把修改的内容写入磁盘上的文件。
来源:https://liyuanjinglyj.blog.csdn.net/article/details/116428621
猜你喜欢
- 一,进程的理论基础一个应用程序,归根结底是一堆代码,是静态的,而进程才是执行中的程序,在一个程序运行的时候会有多个进程并发执行。进程和线程的
- 顾名思义,本期内容肯定是涉及编程时间,那在操作python要怎么用time这个方法呢?一起来看下吧~时间模块的定义与使用:时间模块time是
- 记住:这时候08安装的时候要自定义一个实例 比如:mysql2008(不能在使用默认实例了) sql server 2008 express
- 在使用pip安装Tensorflow后,在其目录中没有找到model目录,重复安装了两遍依然没有,原因未知。于是,使用源码安装的方法:(1)
- 1.python爬虫浏览器伪装#导入urllib.request模块import urllib.request#设置请求头headers=(
- 前言pyinstaller能够在Windows、Linux等操作系统下将Python脚本打包成可直接运行程序。使Python脚本
- 为了实现项目中的搜索功能,我们使用的是全文检索框架haystack+搜索引擎whoosh+中文分词包jieba安装和配置安装所需包pip i
- 一、设置开启SMTP服务并获取授权码可以参考第一篇文章,这里不再赘述:【一】https://www.jb51.net/article/142
- 利用这个小游戏可以学习一下ython3.3中tkinter的使用方法# -*- coding: utf-8 -*-import tkinte
- 首先为大家分享python实现发送手机短信验证码后台方法,供大家参考,具体内容如下1、生成4位数字验证码def createPhoneCod
- 在Pytorch中,torch.utils.data中的Dataset与DataLoader是处理数据集的两个函数,用来处理加载数据集。通常
- 为了防止网络上日益猖獗的垃圾广告和灌水评论,大多数网站在信息发布的时候要求输入验证码。图片、文字、字母甚至还有计算题。验证码图片里的信息东颠
- 首先打击我的就是rpm安装,它告诉我发现了Mysql版本冲突,安装无法继续。我用rpm -q 查询后,想通过rpm -e 来删除系统自带的版
- 相信大家在爬虫中都设置过请求头 user-agent 这个参数吧? 在请求的时候,加入这个参数,就可以一定程度的伪装成浏览器,就不会被服务器
- 首先要解释一下:“极致之美”不是说月儿的这篇文章,因为本人还没有自大到这种程度:P,它形容的是Lisp和javascript结合的优美形态。
- upload.htm <html><head><title>网站维护 -
- 本文实例讲述了php延迟静态绑定的方法。分享给大家供大家参考。具体分析如下:php延迟静态绑定:指类的self,不是以定义时为准,而是以计算
- 本文实例为大家分享了python爬取淘宝商品的具体代码,供大家参考,具体内容如下import requests as req import
- 这篇文章主要介绍了在SQL Server中处理空值时所涉及的3个问题:计数、使用空表值以及外键处理。用COUNT(*)处理空值大多数集合函数
- 本文实例讲述了python中os操作文件及文件路径的方法。分享给大家供大家参考。具体分析如下:python获取文件上一级目录:取文件所在目录