Linux 内存映射mmap,内存映射mmap
Table of Contents
1. 什么是mmap
2. 使用方法
2.1. mmap构造器的格式
2.2. 例子1
2.3. 例子2
3. 其它
4. 参考资料
什么是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/
Linux 内存映射mmap,内存映射mmap相关推荐
- linux mmap内存文件映射
一.传统文件访问 unix访问文件的传统方法使用open打开他们,如果有多个进程访问一个文件,则每一个进程在再记得地址空间都包含有该文件的副本,这不必要地浪费了存储空间.下面说明了两个进程同时读一个文 ...
- Linux的mmap内存映射机制解析
在讲述文件映射的概念时,不可避免的要牵涉到虚存(SVR 4的VM).实际上,文件映射是虚存的中心概念,文件映射一方面给用户提供了一组措施,好似用户将文件映射到自己地址空间的某个部分,使用简单的内存访问 ...
- linux mmap 内存映射
http://www.perfgeeks.com/?p=723 mmap() vs read()/write()/lseek() 通过strace统计系统调用的时候,经常可以看到mmap()与mmap ...
- linux mmap 内存映射 mmap() vs read()/write()/lseek()
From: http://www.perfgeeks.com/?p=723 通过strace统计系统调用的时候,经常可以看到mmap()与mmap2().系统调用mmap()可以将某文件映射至内存(进 ...
- Linux mmap内存映射
将最近网上搜索的资料统一整理下,方便后续复查. 一.什么是mmap mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一 ...
- linux内存管理函数mmap和brk,brk() 和 mmap() 内存映射
参考博文:http://www.cnblogs.com/huxiao-tee/p/4660352.html x86平台下linux进程虚拟地址空间分布(2.6.7以前版本) mmap区域与栈区域相对增 ...
- Linux内存管理子系统——mmap内存映射原理分析(dax文件系统的mmap)
Linux mmap分析 内核版本:linux-5.16 1. 虚拟内存概要及相关内容简介 内存映射是学习过操作系统的大家都耳熟能详的词,理解起来也很简单.所谓"映射"就是为一种事 ...
- Linux系统:内存映射概念以及相关函数(mmap、munmap、msync)介绍
Linux系统:内存映射概念以及相关函数(mmap.munmap.msync)介绍 1.1 基本概念 内存映射根据种类分为: 文件映射:将一个文件的一部分直接映射到虚拟进程地址空间中,虚拟进程地址空间 ...
- 实验3 linux内存映射,3Linux内存映射,mmap()函数
1mmap()依赖的头文件 #include 2函数声明: void *mmap(void *addr, size_t length, intprot, int flags, intfd, of ...
- Linux学习之系统编程篇:mmap 内存映射区
(1)作用:将磁盘文件的数据映射内存,用户通过修改内存就能修改磁盘文件. (2)函数原型: void *mmap(void *addr, size_t length, int prot, int fl ...
最新文章
- 25个强大的 jQuery 砌体网页设计作品
- 如何使用万用表测量随机噪声
- python - 异常处理
- asp.net core webapi 统一处理返回值、异常和请求参数验证
- 恭喜神策数据客户即刻完成 C 轮融资
- 云信市场运营总监:产品运营不得不避免的5个大坑
- php 打印变量内存地址_Python合集之Python变量
- 关于Chrome内核88版本无法正常使用Adobe Flash Player公告
- 利用VMware Infrastructure SDK编程控制虚拟机集群(2)
- Android Canvas drawText实现中文垂直居中
- 华为6p连接计算机设置在哪里设置密码,华为路由器和华为手机如何不用密码连接...
- 【自然语言处理】【知识图谱】知识图谱表示学习(一):TransE、TransH、TransR、CTransR、TransD
- php影院影城源码,99影院源码 影视网站程序源码/附教程
- android apk反编译(Doapk工具和dex2jar工具介绍)
- 怎样实现订单和销量快速增长?电商小程序的五大裂变玩法需了解!
- 10G数据不用框架快速去重
- 佛说爱情五:镜花和水月
- 基于Ad hoc的多跳通信
- 【实验3】——目标的分辨能力
- 易语言mysql防破解_易语言程序真正防止破J的思路以及解决案例