Python进阶之-mmap详解

2024-06-07 13:20
文章标签 python 进阶 详解 mmap

本文主要是介绍Python进阶之-mmap详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

✨前言:

Python中的mmap模块允许你创建一个内存映射的文件,这意味着文件数据直接映射到虚拟内存。这样做的好处包括:提高文件访问速度、可通过修改内存来修改文件、可以像操作普通内存一样操作这块特殊的内存区域。

✨mmap基础

要使用mmap,需要先导入该模块

import mmap

你需要一个文件描述符(可以是一个打开的文件对象的.fileno()方法返回的,也可以是一个现有的文件描述符),使用这个文件描述符,可以创建一个mmap对象:

import mmap# 打开文件
with open("example.dat", "r+b") as f:# 创建内存映射mm = mmap.mmap(f.fileno(), 0)# 使用mmap对象...# 完成后,解除映射mm.close()

✨mmap常用方法

1.mmap.read(byte):读取指定数量的字节。
2.mmap.readline():读取一行。
3.mmap[:N]或mmap.read(N):读取前N个字节。
4.mmap.seek(offset):移动当前位置至指定offset。
5.mmap.tell():获取当前位置。
6.mmap.write(bytes):写入字节字符串。
7.mmap.flush():将更改写回文件中。在某些情况下是必须的,例如,当对文件内容进行更改而想将更改保存至磁盘时。
8.mmap.close():关闭内存映射文件。

✨举例说明

🌟例1:基础读写

考虑一个文件example.dat,先写入一些数据然后通过内存映射来修改它。

import mmapwith open("example.dat", "r+b") as f:mm = mmap.mmap(f.fileno(), 0)print("Original:", mm[:].decode())  # 读取内容replacement = b"World!"original_size = len(mm[:])replacement_size = len(replacement) + 6  # +6因为替换起始于第6位if replacement_size <= original_size:# 此处简单处理,用空格补齐,只为示例replacement = replacement.ljust(original_size - 6, b' ')mm[6:] = replacement  # 修改内容mm.seek(0)  # 移动至文件开头print("Modified:", mm[:].decode())  # 再次读取内容else:print("Replacement string is too long.")mm.close()

🌟例2:搜索和替换

如果想在内存映射文件中搜索特定的文本,并且替换它:


import mmap# 首先,创建/重新创建文件并写入 "Hello World!"
with open("example.dat", "wb") as f:f.write(b"Hello World!")with open("example.dat", "r+b") as f:mm = mmap.mmap(f.fileno(), 0)start = mm.find(b"World")if start != -1:mm[start:start+5] = b"debug"mm.seek(0)print("After replace:", mm[:].decode())   # 正确的输出应该是 "Hello debug!"mm.close()

🌟例3 性能对比

创建测试文件

with open("large_file.txt", "wb") as f:f.write(b"0" * 1024 * 1024 * 100)  # 创建一个100MB的文件

普通文件读取测试

import time
start_time = time.time()
with open("large_file.txt", "rb") as f:content = f.read(10)  # 同样只读取前10个字节作为示例
elapsed_time = round(time.time() - start_time, 6)print("普通读取耗时:", elapsed_time) # 普通读取耗时: 0.011448

mmap 读取测试

start_time = time.time()
with open("large_file.txt", "r+b") as f:mm = mmap.mmap(f.fileno(), 0)content = mm[:10]  # 假设我们只读取前10个字节作为示例mm.close()
elapsed_time = round(time.time() - start_time, 6)print("mmap读取耗时:", elapsed_time)  # mmap读取耗时: 0.008091

⚠️ 注意: 由于mmap修改的是内存中的数据,文件内容也会同步更改,实现对文件的快速读写操作。一定要注意的是,在使用内存映射文件时,尤其是在修改文件内容时,应保证替换内容的字节长度不变,否则可能会导致数据错乱或者程序崩溃。

这篇关于Python进阶之-mmap详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1039295

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

[MySQL表的增删改查-进阶]

🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 💻💻💻数据库约束 🔭🔭🔭约束类型 not null: 指示某列不能存储 NULL 值unique: 保证某列的每行必须有唯一的值default: 规定没有给列赋值时的默认值.primary key: