----使用内存映射的原因

为了随机访问文件的内容,使用mmap将文件映射到内存中是一个高效和优雅的方法。例如,无需打开一个文件并执行大量的seek(),read(),write()调用,只需要简单的映射文件并使用切片操作访问数据即可。

内存映射一个文件并不会导致这个文件被读取到内存中。也就是说,文件并没有被复制到内存缓存或数组中。相反,操作系统仅仅为文件内容保留了一段虚拟内存。当访问文件的不同区域时,这些区域的内容才根据需要被读取并映射到内存区域中。而那些从没被访问到的部分还是留在磁盘上。所有这些过程都是透明的,在幕后完成。

如果多个python解释器内存映射同一个文件,得到的mmap对象能够被用来在解释器直接交换数据。也就是说,所有解释器都能同时读写数据,并且其中一个结婚iqsuozuo的修改会自动呈现在其他解释器中。很明显,这里需要考虑同步的问题。但是这种方法有时候可以用来在关岛或套接字间传递数据。

----mmap是什么

mmap是一种虚拟内存映射文件的方法,它可以将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对应关系。

mmap 模块提供“内存映射的文件对象”,mmap 对象可以用在使用 plain string 的地方,mmap 对象和 plain string 的区别是:

  • mmap 对象不提供字符串对象的方法;
  • mmap 对象是可变的,而 str 对象是不可变的
  • mmap 对象同时对应于打开的文件,多态于一个Python file 对象

  mmap 对象可以切片和索引,也可以为它的切片或索引赋值(因为 mmap 对象是可变的),为 mmap 对象的切片赋值时,赋值语句右值的长度必须和左值切片的长度相同。mmap 对象可以作为进程间通过文件进行 IPC 的一种替换手段。

----创建 mmap 对象

mmap(filedesc, length, tagname='') #windows
mmap(filedesc, length, flag=MAP_SHARED, prot=PROT_READ|PROT_WRITE) #Unix

  创建并返回一个 mmap 对象,参数 filedesc 通常是由 f.fileno()获得的,这在Python文件系列中已经介绍过。

  mmap 创建对象的含义是:将指定 fd 的前 length 字节映射到内存。

  Windows中,可以通过参数tagname为一段内存映射指定名称,这样一个文件上面可以同时具有多个 mmap。windows中的内存映射都是可读可写的,同时在进程之间共享。

  Unix平台上,参数 flags 的可选值包括:

    mmap.MAP_PRIVATE:这段内存映射只有本进程可用;

    mmap.MAP_SHARED:将内存映射和其他进程共享,所有映射了同一文件的进程,都能够看到其中一个所做的更改;

  参数 prot 对应的取值包括:mmap.PROT_READ, mmap.PROT_WRITE 和 mmap.PROT_WRITE | mmap.PROT_READ。最后一者的含义是同时可读可写。

----mmap 对象的方法

m.close()   关闭 m 对应的文件;

m.find(str, start=0)   从 start 下标开始,在 m 中从左往右寻找子串 str 最早出现的下标;

m.flush([offset, n])   把 m 中从offset开始的n个字节刷到对应的文件中,参数 offset 要么同时指定,要么同时不指定;

m.move(dstoff, srcoff, n)   等于 m[dstoff:dstoff+n] = m[srcoff:srcoff+n],把从 srcoff 开始的 n 个字节复制到从 dstoff 开始的n个字节,可能会覆盖重叠的部分。

m.read(n)   返回一个字符串,从 m 对应的文件中最多读取 n 个字节,将会把 m 对应文件的位置指针向后移动;

m.read_byte()   返回一个1字节长的字符串,从 m 对应的文件中读1个字节,要是已经到了EOF还调用 read_byte(),则抛出异常 ValueError;

m.readline()   返回一个字符串,从 m 对应文件的当前位置到下一个'\n',当调用 readline() 时文件位于 EOF,则返回空字符串;

m.resize(n)   把 m 的长度改为 n,m 的长度和 m 对应文件的长度是独立的;

m.seek(pos, how=0)   同 file 对象的 seek 操作,改变 m 对应的文件的当前位置;

m.size()   返回 m 对应文件的长度(不是 m 对象的长度len(m));

m.tell()   返回 m 对应文件的当前位置;

m.write(str)   把 str 写到 m 对应文件的当前位置,如果从 m 对应文件的当前位置到 m 结尾剩余的空间不足len(str),则抛出 ValueError

m.write_byte(byte)   把1个字节(对应一个字符)写到 m 对应文件的当前位置,实际上 m.write_byte(ch) 等于 m.write(ch)。如果 m 对应文件的当前位置在 m 的结尾,也就是 m 对应文件的当前位置到 m 结尾剩余的空间不足1个字节,write() 抛出异常ValueError,而 write_byte() 什么都不做。

参考:

https://www.cnblogs.com/Security-Darren/p/4733387.html

https://docs.python.org/2/library/mmap.html

转载于:https://www.cnblogs.com/baxianhua/p/10212766.html

python mmap对象相关推荐

  1. python mmap_python mmap对象

    ----使用内存映射的原因 为了随机访问文件的内容,使用mmap将文件映射到内存中是一个高效和优雅的方法.例如,无需打开一个文件并执行大量的seek(),read(),write()调用,只需要简单的 ...

  2. 完全理解 Python 迭代对象、迭代器、生成器(转)

    完全理解 Python 迭代对象.迭代器.生成器 本文源自RQ作者的一篇博文,原文是Iterables vs. Iterators vs. Generators » nvie.com,俺写的这篇文章是 ...

  3. python类对象和实例对象

    类对象支持两种操作:属性引用和实例化. 属性引用 使用 Python 中所有属性引用所使用的标准语法: obj.name. 有效的属性名称是类对象被创建时存在于类命名空间中的所有名称. 因此,如果类定 ...

  4. python哪些是可变对象_什么是Python可变对象和不可变对象

    什么是Python可变对象和不可变对象 发布时间:2020-07-22 09:59:15 来源:亿速云 阅读:60 作者:Leah 这篇文章运用简单易懂的例子给大家介绍什么是Python可变对象和不可 ...

  5. python和对象复习_面向对象阶段复习

    面向对象阶段复习 一.类,对象,属性方法调用 class 类名(父类1,父类2): 静态属性 = '' # 静态属性,也叫类属性 def __init__(self): # 初始化方法 self.na ...

  6. 弱引用的用途:在底层C++对象被上层python脚本对象使用时(转)

    在使用python脚本和底层C++对象进行交互的过程中发生了一个问题:由于底层C++对象的创建和删除决定权由底层决定,当底层决定删除这些对象而上层仍然在"强引用"这些对象的时候,就 ...

  7. python 视图对象_python web框架篇:views视图函数

    Django请求的生命周期是怎样的? 简单地说,通过URL对应关系匹配 ->找到对应的函数(或者类)->返回字符串(或者读取Html之后返回渲染的字符串) 解剖起来如下: 1. 当用户在浏 ...

  8. python遇到对象_### python面对对象小汇总 #####

    python面对对象小汇总 类的起名规则 # 所有的类名要求首字母大写,多个单词使用驼峰式命名法 如 ValueError # 类中方法: 普通方法 类方法 静态方法 魔术方法 class Phone ...

  9. 还不会python面相对象?活该单身(面向对象基础+交互关系)

    文章目录 概述 名词解释 类的定义 类的实例化 类属性 两个对象的交互 依赖关系 关联关系 组合关系 类变量的用途 概述 活在当下的程序员应该都听过"面向对象编程"一词,之前太懒了 ...

最新文章

  1. pandas使用groupby函数计算dataframe数据中每个分组的N个数值的指数权重移动(滚动)平均、例如,计算某公司的多个店铺每N天(5天)的滚动销售额指数权重移动(滚动)平均
  2. 请你要幸福 这是 你唯一能为我做到的
  3. oracle中database,Oracle Database 一些基本的视图和表
  4. spring security源码分析之一springSecurityFilterChain
  5. PyQt、QtDesigner及其它工具包的安装
  6. char与TCHAR相互转化
  7. php recursion,PHP与Recursion 学习笔记
  8. java servlet 输出_JavaWeb中servlet读取配置文件的方式
  9. SAP Spartacus运行时错误 - The pipe cxUrl could not be found!
  10. ACM 网址和一些建议
  11. 计算机基础知识整理 手抄报,科技小制作的手抄报资料简单字少
  12. 为什么range不是迭代器?range到底是什么类型?
  13. cron计划任务、chkconfig工具、systemd管理服务、unit、target介绍
  14. 查看Sql Server2016是否激活
  15. 计算机c盘快满了怎么办,电脑C盘满了怎么办?教你快速清理C盘的垃圾
  16. 高数 | 【多元函数微分学】如何判断二元微分式是否为全微分
  17. linux驱动学习二---driver
  18. 小红书笔记api_odoo与小红书对接笔记
  19. pde与波长 sipm 关系_基于SiPM和TCMPC的时间分辨拉曼散射测量技术研究
  20. java连不上sqlserver_java和SQL连接不上——解决步骤

热门文章

  1. [Google Guava] 10-散列
  2. Jeff Atwood倾情推荐——程序员必读之书
  3. 稀疏表示介绍(中)、(下)
  4. 稀疏性和L1正则化基础 Sparsity and Some Basics of L1 Regularization
  5. Machine Learning week 9 quiz: Recommender Systems
  6. 数字图像处理:第四章 点运算
  7. 2.本征矩阵 基本矩阵以及对极几何之间的约束关系
  8. tf.train.examle函数
  9. docker学习系列14 使用haproxy实现mysql集群的负载均衡...
  10. Ubuntu 16.04下减小/释放/清理VirtualBox虚拟硬盘文件的大小