内存映射mmap
2024-10-29 22:45:59
原文Table of Contents
什么是mmap
通常在Unix系统里有两种操作的数据类型:内存地址和流文件(stream)。通过操作内存地址的方法涉及的操作有:pointers, malloc/free之类,而操作流文件涉及的方法有read/write/seek等系统调用或者send/recv/etc等socket操作。而mmap提供了结合上述两种类型的操作方式。简单来讲,mmap可以创建一个内存映射(memory-mapped)类型的文件,可以直接在内存操作文件,而不需要使用通常的read,wirte这些系统I/O调用。这样的好处是避免了操作文件是频繁地系统调用。
使用方法
内存映射(memory-mapped)可以像字符串和文件对象一样操作,通过 mmap 来创建。
例子中采用的hello.txt文件如下:
Hello, i am Nisen,
Nice to meet you!
Goodbye.
mmap构造器的格式
# Unix version
class mmap.mmap(fileno, length[, flags[, prot[, access[, offset]]]])
# Windows version
class mmap.mmap(fileno, length[, tagname[, access[, offset]]])
fileno是流文件的描述符,length指定映射文件到内存的bytes的长度,设置为0的话代表全部。Unix接口中的flags指定这个创建出来的mapping是否对创建的进程私有,默认是共享的。prot和access指定需要的内存保护(读写相关),其它参数的含义可以参照文档。
接下来让我们采用Unix的接口,做些实验吧。
例子1
import mmap
with open('hello.txt', 'r') as f:
m = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
print m.readline()
m.close()
运行的结果如下:
Hello, i am Nisen,
python3.2以后mmap支持用with的方式操作
# New in version 3.2: Context manager support.
with open('hello.txt', 'r') as f:
with mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) as m:
print('First 10 bytes via read :', m.read(10))
print('First 10 bytes via slice:', m[:10])
运行后的结果
python3 test.py
First 10 bytes via read : b'Hello, i am Nisen,\nNice to meet you!\nGoodbye.\n'
First 10 bytes via slice: b'Hello, i a'
例子2
常见的方法如下
with open('hello.txt', 'r+') as f:
# 指定访问权限为write, 一共有3种权限指定:ACCESS_READ, ACCESS_WRITE, ACCESS_COPY
m = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_WRITE)
# 输出一行
print m.readline()
# 指针重置
m.seek(0)
# 查找"Nisen"出现的第一个地方,返回索引
index = m.find('Nisen')
print index
m.seek(0)
# 直接修改内容
m[index: index+5] = "Rubby"
# 将内存中的修改存到磁盘中的文件上
m.flush()
m.seek(0)
print m.readline()
# 关闭内存映射文件
m.close()
运行结果如下:
➜ python test2.py
Hello, i am Nisen,
12
Hello, i am Rubby,
其它
- mmap的read()方法在python3.3开始可以接受空参数,表示读取文件所有的内容
- 在创建mmap对象指定权限的时候,注意本来文件描述符拥有的权限。如果使用open()打开文件的权限指定了'r', 用mmap创建映射对象时指定
ACCESS_WRITE,那么会报Permission denied的错误 - 关于文件打开模式"r+"和"w+"的用法可以参考这里这里
- 在多线程编程时,如果多个线程以只读的方式访问同一个文件,那么可以采用mmap创一个映射对象来减少内存的使用提升性能
- mmap会将文件对象一次读取到连续内存空间上,如果文件过大导致找不到可用的内存空间,那么创建这个映射对象将会失败
- mmap加快文件操作的例子可以参照这里
参考资料
- https://docs.python.org/2.7/library/mmap.html
- https://docs.python.org/3.5/library/mmap.html
- https://pymotw.com/3/mmap/
- http://pythoncentral.io/memory-mapped-mmap-file-support-in-python/
- http://stackoverflow.com/questions/21113919/difference-between-r-and-w-in-fopen
- https://blog.schmichael.com/2011/05/15/sharing-python-data-between-processes-using-mmap/
内存映射mmap的更多相关文章
- 内存映射mmap的几个api及其使用
内存映射 mmap 内存映射mmap函数的作用是建立一段可以被两个或者多个程度读写的内存段,一个程序对他进行任何修改,对其它程序可见.同样,这个功能可以用在对文件的处理上,mmap函数创建一个指向一个 ...
- 深入理解内存映射mmap
内存映射mmap是Linux内核的一个重要机制,它和虚拟内存管理以及文件IO都有直接的关系,这篇细说一下mmap的一些要点. 修改(2015-11-12):Linux的虚拟内存管理是基于mmap来实现 ...
- [转载]linux内存映射mmap原理分析【转】
转自:http://www.cnblogs.com/wanpengcoder/articles/5306688.html 转自:http://blog.csdn.net/yusiguyuan/arti ...
- 计算机底层知识拾遗(九)深入理解内存映射mmap
内存映射mmap是Linux内核的一个重要机制,它和虚拟内存管理以及文件IO都有直接的关系,这篇细说一下mmap的一些要点. 修改(2015-11-12):Linux的虚拟内存管理是基于mmap来实现 ...
- 内存映射MMAP和DMA【转】
转自:http://blog.csdn.net/zhoudengqing/article/details/41654293 版权声明:本文为博主原创文章,未经博主允许不得转载. 这一章介绍Linux内 ...
- Linux内存映射(mmap)系列(1)
看到同事的代码中出现了mmap.所以自己私下学习学习,研究研究..... http://www.cnblogs.com/lknlfy/archive/2012/04/27/2473804.html ( ...
- Linux内存映射--mmap函数
Linux提供了内存映射函数mmap, 它把文件内容映射到一段内存上(准确说是虚拟内存上), 通过对这段内存的读取和修改, 实现对文件的读取和修改, 先来看一下mmap的函数声明: 头文件: < ...
- linux mmap 内存映射【转】
转自:http://blog.csdn.net/xyyangkun/article/details/7830313 [-] mmap vs readwritelseek mmap vs malloc ...
- mmap内存映射
http://blog.csdn.net/kongdefei5000/article/details/70183119 内存映射是个很有用,也很有意思的思想.我们都知道操作系统分为用户态和内核态,用户 ...
随机推荐
- rhel及相关linux系统版本知识
Rhel 此处Rhel非等同redhat哦,RedHat是红帽公司在1994年左右开发维护的linux桌面版本,在2004年左右红帽公司放弃redhat开始进军linux服务器版本开发,具体见下截图 ...
- Cocos2d-x项目移植到WinRT/Win8小记
Cocos2d-x项目移植到WinRT/Win8小记 作者: K.C. 日期: 11/17/2013 Date: 2013-11-17 23:33 Title: Cocos2d-x项目移植到WinRT ...
- Scene View Navigation
[Scene View Navigation] Hold the right mouse button to enter Flythrough mode. This turns your mouse ...
- Mysql SQL优化&执行计划
SQL优化准则 禁用select * 使用select count(*) 统计行数 尽量少运算 尽量避免全表扫描,如果可以,在过滤列建立索引 尽量避免在where子句对字段进行null判断 尽量避免在 ...
- Linux应用总结:自动删除n天前日志
linux是一个很能自动产生文件的系统,日志.邮件.备份等.虽然现在硬盘廉价,我们可以有很多硬盘空间供这些文件浪费,让系统定时清理一些不需要的文件很有一种爽快的事情.不用你去每天惦记着是否需要清理日志 ...
- C#图解教程读书笔记(第1章 C#和.net框架)
C#中的主要需要记住的基础概念 CLR公共语言运行库 CIL中间语言,所有的代码都会编译成中间语言. CLI公共语言基础结构 C#的优点 C#有自动垃圾回收机制
- eclipse 最有用的10个快捷键
1Eclipse中10个最有用的快捷键组合 一个Eclipse骨灰级开发者总结了他认为最有用但又不太为人所知的快捷键组合.通过这些组合可以更加容易的浏览源代码,使得整体的开发效率和质量得到提升. ...
- Java浮点数精确计算
BigDecimal是Java提供的一个不变的.任意精度的有符号十进制数对象.
- 关于document.referrer的使用需要注意
项目使用到一个场景,ajax请求返回无权限,跳回登录页面,登录后自动返回之前的浏览页,跳转由前端处理,于是想到document.referrer,但是对可靠性不确定,特意搜索了一下相关资料,大致整理如 ...
- 学习web前端前感
我与IT 不知不觉二十个春夏秋冬过去了,我也从一个小孩变成了大人......然而并没什么卵用!这二十年来一直贴着“菜鸟”这样的标签,自小爱朝抵抗力小的方向走,这陋习至今还蔓延着,让人看来像是怒其不争的 ...