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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/25381.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式仪器模块:音频综测仪和自动化测试软件

• 24 位分辨率 • 192 KHz 采样率 • 支持多种模拟/数字音频信号的输入/输出 应用场景 • 音频信号分析&#xff1a;幅值、频率、占空比、THD、THDN 等指标 • 模拟音频测试&#xff1a;耳机、麦克风、扬声器测试&#xff0c;串扰测试 • 数字音频测试&#xff1a;平板电…

高考志愿填报:大学学什么专业比较好呢?

准高三一枚&#xff0c;比较迷茫&#xff0c;求推荐一些专业以后比较好就业&#xff0c;发展前景较好的。听说互联网行业比较吃香&#xff0c;有想过以后做运营这一块&#xff0c;但是不知道应该在大学选什么专业&#xff0c;求推荐吧&#xff01; 学什么专业好&#xff1f; 这…

Vitis HLS 学习笔记--global_array_RAM初始化及复位

目录 1. 简介 2. 示例代分析 2.1 源代码 2.2 URAM 不可用 2.3 代码功能解释 2.4 综合报告 2.4.1 顶层控制接口 2.4.2 软件 IO 信息 2.4.3 存储绑定 3. 对比两种 solution 3.1 solution_A 3.2 solution_B 4. 总结 1. 简介 在C程序中&#xff0c;数组是一种基本的…

数据库漫谈-MongoDB

MongoDB是非关系型数据库&#xff0c;适合存储文档&#xff0c;存储大数据。MongoDB其实是广告公司发明的&#xff0c;因为现有的关系型数据库不适合广告行业&#xff0c;所以他们就自己做了一个数据库。MongoDB具有如下几个特点&#xff1a; 1、高可用。它是分布式数据库&…

LLM的基础模型8:深入注意力机制

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提…

jspm基于Java Web的网上购物系统的设计与实现-手把手调试搭建

jspm基于Java Web的网上购物系统的设计与实现-手把手调试搭建 jspm基于Java Web的网上购物系统的设计与实现-手把手调试搭建

整理好了!2024年最常见 20 道分布式、微服务面试题(六)

上一篇地址&#xff1a;整理好了&#xff01;2024年最常见 20 道分布式、微服务面试题&#xff08;五&#xff09;-CSDN博客 十一、什么是服务网格&#xff08;如Istio或Linkerd&#xff09;&#xff1f; 服务网格&#xff08;Service Mesh&#xff09;是一种微服务架构中的基…

在线按模板批量生成文本工具

具体请前往&#xff1a;在线按模板批量生成文本工具

URL的编码解码(一),仅针对ASCII码字符

用十六进制对特定字符编码&#xff0c;利用百分号标识搜索字符串解码十六进制字符。 (笔记模板由python脚本于2024年06月09日 18:05:25创建&#xff0c;本篇笔记适合喜好探寻URL的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free…

Java Set系列集合的使用规则和场景(HashSet,LinkedHashSet,TreeSet)

Set集合 package SetDemo;import java.util.HashSet; import java.util.Iterator; import java.util.Set;public class SetDemo {public static void main(String[] args) {/*Set集合的特点&#xff1a;1.Set系列集合的特点&#xff1a;Set集合是一个存储元素不能重复的集合方…

Synchronized的锁膨胀艺术:深入源码的探险之旅

1. 引言 在Java的并发编程中,synchronized关键字一直扮演着举足轻重的角色。然而,随着并发需求的不断增长和性能要求的日益提高,单纯的synchronized关键字已经无法满足所有场景的需求。从JDK 1.6开始,Java对synchronized进行了深度的优化,其中最为引人注目的便是“锁膨胀…

如何使用 Python 的字典来存储和检索数据,以提高数据操作的效率?

Python 的字典&#xff08;Dictionary&#xff09;是一种基于键值对的数据结构&#xff0c;它提供了高效的数据存储和检索方式。以下是一些使用字典来提高数据操作效率的技巧&#xff1a; 使用合适的键&#xff1a; 选择不可变类型&#xff08;如字符串、数字或元组&#xff09…

VB6.0 调用存储过程

最近有在做一个需求&#xff0c;需要在VB6.0中调用存储过程&#xff0c;整理了一下&#xff0c;供大家参考&#xff0c; 范例&#xff1a; 1 Function callStoredProcedure(sEmployeeID As String, Optional sNotes As String "") As String2 On Error GoTo er…

Vue13-计算属性的简写

一、计算属性的简写 注意&#xff1a; 当计算属性只有get&#xff0c;没有set的时候&#xff0c;才能用简写形式&#xff01;&#xff01;&#xff01;

svn的使用

【图文详解】入职必备——SVN使用教程-CSDN博客 使用SVNBucket作为服务端,来辅助学习. 什么时候会产生冲突呢? 原本A,B,服务器的版本都一致,都是最新版. A修改文件m,向服务器提交 B修改文件m,向服务器提交,这时候出现了冲突 双击冲突的文件,手动修改

---java 抽象类 和 接口---

抽象类 再面向对对象的语言中&#xff0c;所以的对象都是通过类来描述的&#xff0c;但如果这个类无法准确的描述对象的 话&#xff0c;那么就可以把这个类设置为抽象类。 实例 这里用到abstract修饰&#xff0c;表示这个类或方法是抽象方法 因为会重写motifs里的show方法…

【爬虫实战项目一】Python爬取豆瓣电影榜单数据

目录 一、环境准备 二、编写代码 2.1 分页分析 2.2 编码 一、环境准备 安装requests和lxml pip install requests pip install lxml 二、编写代码 2.1 分页分析 编写代码前我们先看看榜单的url 我们假如要爬取五页的数据&#xff0c;那么五个url分别是&#xff1a; htt…

Python基础教程(七):函数编程-从基础到进阶

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

再读高考作文题

新课标I卷&#xff1a;讨论了随着互联网和人工智能的普及&#xff0c;问题是否会变得越来越少&#xff0c;要求考生写一篇文章&#xff0c;表达自己对于这一现象的联想和思考。 从来就没有什么救世主 AI也不是​​​​​ 一直不会写作文&#xff0c;直到高中&#xff0c;才堪堪…

【环境搭建】5.阿里云ECS服务器 安装Nginx

在阿里云的 Alibaba Cloud Linux 3.2104 LTS 64位系统上安装 Nginx&#xff0c;您可以按照以下步骤进行。Alibaba Cloud Linux 基于 CentOS&#xff0c;因此大部分步骤与 CentOS 系统类似。 步骤 1&#xff1a;更新系统软件包 首先&#xff0c;更新系统软件包以确保所有软件包…