内存映射mmap

摘要:
目录1.什么是mmap2。用法2.1。mmap构造函数2.2的格式。示例12.3。实施例23。其他4。参考什么是mmap。Unix系统中通常有两种数据类型的操作:再见。mmap构造函数#UniServersionclassmmap的格式。mmap(文件号,

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,
Nice to meet you!
Goodbye.
'
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,
其它
  1. mmap的read()方法在python3.3开始可以接受空参数,表示读取文件所有的内容
  2. 在创建mmap对象指定权限的时候,注意本来文件描述符拥有的权限。如果使用open()打开文件的权限指定了'r', 用mmap创建映射对象时指定 ACCESS_WRITE ,那么会报 Permission denied 的错误
  3. 关于文件打开模式"r+"和"w+"的用法可以参考这里这里
  4. 在多线程编程时,如果多个线程以只读的方式访问同一个文件,那么可以采用mmap创一个映射对象来减少内存的使用提升性能
  5. mmap会将文件对象一次读取到连续内存空间上,如果文件过大导致找不到可用的内存空间,那么创建这个映射对象将会失败
  6. mmap加快文件操作的例子可以参照这里
参考资料

免责声明:文章转载自《内存映射mmap》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C# SignalR 即时通讯 聊天室rpm 包安装的一些常用的命令以及 以及一些依赖包的查看下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

python学习——re模块

re模块 findall***** 返回列表,找所有的匹配结果 语法:findall('正则表达式','待匹配字符串',flag) search***** 返回一个内存地址,这是一个正则匹配的结果span是索引,match是匹配结果,通过group取值;没有对应匹配结果就返回None,group会报错 语法:search(‘正则表达式’,‘待匹配字符串...

sass基础用法

SASS是什么 传统的CSS是一种单纯的描述性样式文件,然而SASS可以对CSS进行预编译处理。 在SASS源码中可以使用变量、函数、继承等动态语言的特性,并且可以编译成CSS文件。 安装与使用 安装 由于sass是ruby写的,所以想要使用sass就需要安装ruby环境。然后再使用gem安装sass。 输入下面的命令进行安装sass: gem inst...

【Python 多进程】

" 一、模块介绍 multiprocess模快 仔细说来,multiprocess不是一个模块,而是python中的一个操作、管理进程的包,之所以叫multi是取自multiple的多功能的意思,这个包中几乎包含了和进程有关的所有子模块。 multiprocess.Process模块 Process能够帮助我们创建子进程,以及对子进程的一些控制....

html声明charset="utf-8"后,浏览器访问中文依旧乱码(绝对有效)

    1.情景展示   html文件已经声明字符集为UTF-8,但是浏览器访问依旧乱码。   标题和页面内容都是乱码,这是怎么回事? 2.原因分析    charset="UTF-8"是让浏览器要用utf-8来解释,而文档的编码格式,是保存时的选择决定的。   也就是说:这个HTML文件保存时的字符集不是UTF-8!   所以,HTML的编码格式不...

WSDL2Java操作指南

  1. 安装JDK1.5, 配置系统环境变量:    下载安装JDK后, 设置环境变量:    JAVA_HOME=C:\Program Files\Java\jdk1.5.0_02    Path=%Path%;%JAVA_HOME%\bin(这里的%Path%指你系统已经有的一系列配置)    CLASSPATH=%JAVA_HOME%\lib 2...

关于pocsuite的使用

0x00 前言 pocsuite的用处就不多说了,早些时候也看到黑哥和余弦大佬在微博上说zoomeye 和pocsuite升级了。 结合最近自己在审计cms,也想收集一下其他cms的poc,比如chybeta大佬的cmsPoc,还有Lucifer1993大佬的AngelSword,用pcosuite重新写一下poc,同时自己审出来的一些"0day"也是可以...