内存映射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 内存映射是个很有用,也很有意思的思想.我们都知道操作系统分为用户态和内核态,用户 ...
随机推荐
- shell变量定义
http://blog.csdn.net/longxibendi/article/details/6125075 set - 读写变量语法:set varName ?value?描述:返回变量varN ...
- 第三百六十天 how can I 坚持
看了两集linux视频,有点懵啊,下班还想走去天安门,想啥呢,太远了. 居住证没法办,哎,要入职两年. 考研要是也不能考,这一年也太.. 点不会那么背吧. 好像没啥了,睡觉.
- Linux下的cut选取命令详解
定义 正如其名,cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的.cut是以每一行为一个处理对象的,这种机制和sed是一样的 剪切依据 cut命令主要是接受三个定位方法: 第一,字节(by ...
- python 遍历删除日志
#! /usr/bin/python2.6#-*- encoding:UTF-8 -*- import osimport os.pathimport time root_dir = os.getcwd ...
- POJ3041Asteroids(二分图最少顶点覆盖)
最少顶点覆盖 = 二分图最大匹配 证明见 http://hi.baidu.com/keeponac/item/111e3438988c786b7d034b56
- 删除对象中的key
delete obj.a; delete obj["a"];
- .NET文件上传的大小限制配置
<system.web> <!--maxRequestLength单位是Kb--> <httpRuntime maxRequestLength="20971 ...
- c# abstract抽象类与继承类子类的构造函数_base
http://blog.itpub.net/9240380/viewspace-718054/ http://blog.163.com/cloud_thegreat/blog/static/10367 ...
- $( document ).ready()&$(window).load()
$( document ).ready() https://learn.jquery.com/using-jquery-core/document-ready/ A page can't be man ...
- 用Java实现菱形的打印输出
import java.util.Scanner; public class dengyao2 { public dengyao2() { super(); } public static void ...