Python使用mmap实现内存映射文件操作

白榆
白榆
发布时间:2026-10-14| 2人浏览过
原创

本文详解Python中mmap库的使用方法,介绍如何通过内存映射提升I/O性能。内容涵盖文件映射原理、读写操作示例、Windows系统限制及ACCESS_COPY模式注意事项,并简述其在嵌入式设备访问和进程间通信中的应用场景。

前言

采用内存映射技术通常能显著提升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,那么不会把修改的内容写入磁盘上的文件。

到此这篇关于Python使用mmap实现内存映射文件操作的文章就介绍到这了,更多相关Python 内存映射文件操作内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。