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 Boot中的路径变量示例详解

《SpringBoot中的路径变量示例详解》SpringBoot中PathVariable通过@PathVariable注解实现URL参数与方法参数绑定,支持多参数接收、类型转换、可选参数、默认值及... 目录一. 基本用法与参数映射1.路径定义2.参数绑定&nhttp://www.chinasem.cnbs

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

Redis中Stream详解及应用小结

《Redis中Stream详解及应用小结》RedisStreams是Redis5.0引入的新功能,提供了一种类似于传统消息队列的机制,但具有更高的灵活性和可扩展性,本文给大家介绍Redis中Strea... 目录1. Redis Stream 概述2. Redis Stream 的基本操作2.1. XADD

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

Java JDK1.8 安装和环境配置教程详解

《JavaJDK1.8安装和环境配置教程详解》文章简要介绍了JDK1.8的安装流程,包括官网下载对应系统版本、安装时选择非系统盘路径、配置JAVA_HOME、CLASSPATH和Path环境变量,... 目录1.下载JDK2.安装JDK3.配置环境变量4.检验JDK官网下载地址:Java Downloads

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

Spring Boot spring-boot-maven-plugin 参数配置详解(最新推荐)

《SpringBootspring-boot-maven-plugin参数配置详解(最新推荐)》文章介绍了SpringBootMaven插件的5个核心目标(repackage、run、start... 目录一 spring-boot-maven-plugin 插件的5个Goals二 应用场景1 重新打包应用

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数