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

前言

内存映射通常可以提高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 内存映射文件操作内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python3 mmap内存映射文件示例解析

    1. mmap内存映射文件 建立一个文件的内存映射将使用操作系统虚拟内存来直接访问文件系统上的数据,而不是使用常规的I/O函数访问数据.内存映射通常可以提供I/O性能,因为使用内存映射是,不需要对每个访问都建立一个单独的系统调用,也不需要在缓冲区之间复制数据:实际上,内核和用户应用都能直接访问内存. 内存映射文件可以看作是可修改的字符串或类似文件的对象,这取决于具体的需要.映射文件支持一般的文件API方法,如close().flush().read().readline().seek().tel

  • Python内存映射文件读写方式

    我就废话不多说了,还是直接看代码吧! import os import time import mmap filename = 'test.txt' #如果不存在,创建. if not os.path.exists(filename): open(filename, 'w') print(os.path.isdir(filename)) if os.path.isfile(filename): print(time.ctime(os.path.getctime(filename))) fd =

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

    前言 内存映射通常可以提高I/O的性能,因为使用内存映射时,不需要对每个访问都建立一个单独的系统调用,也不需要在缓冲区之间复制数据,内核和用户都能很方便的直接访问内存. 说明 1)什么叫映射? ==>就是给一个对象(可以是变量.物理等),起一个唯一的别名,建立一一对应的关系: 2)文件映射:将磁盘上的文件的位置,与进程逻辑地址空间中一块大小相同的区域之间的一一对应: 3)映射后得到一个类似数组类型的东西(mmap.mmap()对象),可以通过类似操作数组的方式,达到对文件内容更改的目的: 优点

  • java 深入理解内存映射文件原理

    内存映射文件原理 首先说说这篇文章要解决什么问题? 1.虚拟内存与内存映射文件的区别与联系. 2.内存映射文件的原理. 3.内存映射文件的效率. 4.传统IO和内存映射效率对比. 虚拟内存与内存映射文件的区别与联系 二者的联系 虚拟内存和内存映射文件都是将一部分内容加载到,另一部分放在磁盘上的一种机制,二者都是应用程序动态性的基础,由于二者的虚拟性,对于用户都是透明的. 虚拟内存其实就是硬盘的一部分,是计算机RAM与硬盘的数据交换区,因为实际的物理内存可能远小于进程的地址空间,这就需要把内存中暂

  • java  深入理解内存映射文件原理

    内存映射文件原理 首先说说这篇文章要解决什么问题? 1.虚拟内存与内存映射文件的区别与联系. 2.内存映射文件的原理. 3.内存映射文件的效率. 4.传统IO和内存映射效率对比. 虚拟内存与内存映射文件的区别与联系 二者的联系 虚拟内存和内存映射文件都是将一部分内容加载到,另一部分放在磁盘上的一种机制,二者都是应用程序动态性的基础,由于二者的虚拟性,对于用户都是透明的. 虚拟内存其实就是硬盘的一部分,是计算机RAM与硬盘的数据交换区,因为实际的物理内存可能远小于进程的地址空间,这就需要把内存中暂

  • C#.Net通信共享内存映射文件Memory Mapped

    目录 内存映射文件究竟是个什么? .Net 共享内存 内存映射文件原理 C# .Net 共享内存 演示代码 C# .Net 进程间通信共享内存 IMServer_Message.exe 代码 IMServer_State.exe代码 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). 内存映射文件对于托管世界的开发人员来说似乎很陌生,但它确实已经是很远古的技术了,而且在操作系统中地位相当.实际上,任何想要共享数据的通信模型都会在幕后使用它

  • Python SQL查询并生成json文件操作示例

    本文实例讲述了Python SQL查询并生成json文件操作.分享给大家供大家参考,具体如下: 1. 数据准备 SQL数据点击此处本站下载. 2. python代码 import datetime import os import mssqlhelper ms = mssqlhelper.MSSQL(host="192.168.0.108", user="sa", pwd="sa", db="ComPrject") def g

  • Python实现的简单读写csv文件操作示例

    本文实例讲述了Python实现的简单读写csv文件操作.分享给大家供大家参考,具体如下: python中有一个读写csv文件的包,直接import csv即可 新建test.csv 1.写 import csv with open("test.csv","w",encoding='utf8') as csvfile: writer=csv.writer(csvfile) writer.writerow(["index","a_name&

  • python调用函数、类和文件操作简单实例总结

    本文实例总结了python调用函数.类和文件操作.分享给大家供大家参考,具体如下: 调用函数有三种方式 一,导入整个模块(所有函数) 导入 import module_name 调用 module_name.function_name() 在这种情况中,不会出现下面两种方式的缺点,即具有相同函数名的问题,因为一个文件中不存在两个相同的文件名.但缺点是能不清晰显示出使用到的函数,调用的时候也需要重复写模块名. 二,导入模块中单个或多个函数 导入 from module_name import fu

  • Python中shutil模块的常用文件操作函数用法示例

    os模块提供了对目录或者文件的新建/删除/查看文件属性,还提供了对文件以及目录的路径操作.比如说:绝对路径,父目录--  但是,os文件的操作还应该包含移动 复制  打包 压缩 解压等操作,这些os模块都没有提供. 而本文所讲的shutil则就是对os中文件操作的补充.--移动 复制  打包 压缩 解压, shutil函数功能: 1  shutil.copyfileobj(fsrc, fdst[, length=16*1024]) copy文件内容到另一个文件,可以copy指定大小的内容 先来看

随机推荐