0

0

Python中如何操作内存映射文件?内存映射有哪些优缺点?

穿越時空

穿越時空

发布时间:2025-06-27 20:54:02

|

451人浏览过

|

来源于php中文网

原创

python 使用 mmap 模块通过内存映射文件实现高效文件操作。1. 创建或打开文件并获取文件描述符;2. 使用 mmap.mmap() 函数将文件映射到进程的虚拟地址空间,参数包括 fileno(文件描述符)、length(映射长度)和 access(访问模式);3. 像操作字节数组一样直接读写内容,支持索引、readline()、seek() 等方法;4. 完成后关闭 mmap 对象以释放资源。内存映射的优势在于避免内核与用户空间的数据拷贝,提升 i/o 效率,简化代码结构,并支持多进程共享文件数据。但需注意同步问题、文件大小限制及平台差异。相比传统 read/write 系统调用,内存映射减少了上下文切换和数据复制次数,尤其适用于大型数据库、日志处理、图像处理等需要频繁访问大文件的场景。例如,结合正则表达式可高效统计大型文本文件中单词出现的次数,且无需逐行读取。

Python中如何操作内存映射文件?内存映射有哪些优缺点?

内存映射文件,简单来说,就是把文件的一部分或者全部映射到进程的虚拟地址空间。这样,你就可以像访问内存一样访问文件,而不用像传统的文件I/O那样,需要read/write 系统调用。Python 提供了 mmap 模块来操作内存映射文件。

Python中如何操作内存映射文件?内存映射有哪些优缺点?
import mmap

# 创建一个文件 (或者打开一个已存在的文件)
with open("test.txt", "wb") as f:
    f.write(b"Hello, memory map!")

# 打开文件,并创建一个内存映射
with open("test.txt", "rb+") as f:
    mm = mmap.mmap(f.fileno(), length=0, access=mmap.ACCESS_WRITE)

    # 打印当前内容
    print(mm.readline())

    # 修改内容
    mm[0:5] = b"World"

    # 回到起始位置
    mm.seek(0)
    print(mm.readline())

    # 关闭内存映射
    mm.close()

Python 如何使用 mmap 模块?

Python中如何操作内存映射文件?内存映射有哪些优缺点?

mmap 模块的核心在于 mmap() 函数。它接受几个关键参数:

立即学习Python免费学习笔记(深入)”;

Python中如何操作内存映射文件?内存映射有哪些优缺点?
  • fileno: 文件的文件描述符,可以通过 file.fileno() 获取。
  • length: 映射的长度,默认为 0,表示映射整个文件。
  • access: 访问模式,例如 mmap.ACCESS_READ (只读), mmap.ACCESS_WRITE (读写), mmap.ACCESS_COPY (写时复制)。

一旦创建了 mmap 对象,你就可以像操作字节数组一样操作它。你可以使用索引来访问和修改内容,也可以使用 readline(), seek(), tell() 等方法。

内存映射的优势是什么?

  • 效率: 避免了内核空间和用户空间之间的数据拷贝,提高了 I/O 效率。特别是对于大文件,可以显著减少系统调用的次数。
  • 简单: 可以像访问内存一样访问文件,代码更简洁。
  • 共享: 多个进程可以同时映射同一个文件,实现进程间通信。

当然,它也有缺点:

谱乐AI
谱乐AI

谱乐AI,集成 Suno、Udio 等顶尖AI音乐模型的一站式AI音乐生成平台。

下载
  • 同步: 需要注意多进程访问时的同步问题。
  • 文件大小: 映射长度受到文件大小的限制。
  • 平台依赖: 不同操作系统对内存映射的实现可能有所差异。

内存映射与传统文件 I/O 的区别

传统文件 I/O (例如 read()/write()) 需要进行系统调用,将数据从内核缓冲区复制到用户空间缓冲区,反之亦然。这个过程涉及上下文切换,开销比较大。

内存映射则直接将文件内容映射到进程的虚拟地址空间,避免了数据拷贝。进程可以直接访问映射的内存区域,而不需要系统调用。

举个例子,假设你要读取一个 1GB 的文件。使用传统 I/O,你可能需要多次调用 read(),每次读取一小部分数据。而使用内存映射,你可以一次性将整个文件映射到内存,然后像访问一个大数组一样访问它。

内存映射在哪些场景下特别有用?

  • 大型数据库: 数据库系统经常使用内存映射来访问数据文件,提高性能。
  • 共享内存: 多个进程需要共享数据时,可以使用内存映射来实现。
  • 日志处理: 快速读取和分析大型日志文件。
  • 图像处理: 处理大型图像文件,避免频繁的 I/O 操作。

例如,你可以使用内存映射来快速统计一个大型文本文件中某个单词出现的次数。

import mmap
import re

def count_word(filename, word):
    with open(filename, "r") as f:
        with mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) as mm:
            count = 0
            for match in re.finditer(word.encode('utf-8'), mm):
                count += 1
            return count

filename = "large_text_file.txt"
word = "example"
count = count_word(filename, word)
print(f"The word '{word}' appears {count} times in {filename}")

这个例子展示了如何使用 mmap 和正则表达式来快速查找大型文件中的单词。注意,我们需要将单词编码为字节串,因为 mmap 对象返回的是字节。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

751

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

636

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

758

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

618

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1262

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

577

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

706

2023.08.11

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.6万人学习

Django 教程
Django 教程

共28课时 | 3.1万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号