mmap- 内存映射文件支持

内存映射文件对象的行为bytearray类似于 文件对象。您可以在bytearray预期的大多数地方使用mmap对象; 例如,您可以使用该re 模块搜索内存映射文件。您也可以通过执行更改单个字节,或通过分配切片来更改子序列:。您还可以从当前文件位置开始读取和写入数据,并通过文件读取和写入不同的位置。obj[index] =97obj[i1:i2] = b'...'seek()

内存映射文件由mmap构造函数创建,在Unix和Windows上不同。在任何一种情况下,您都必须为打开以进行更新的文件提供文件描述符。如果要映射现有的Python文件对象,请使用其fileno()方法获取fileno参数的正确值 。否则,您可以使用os.open()函数打开文件,该 函数直接返回文件描述符(完成后仍需要关闭文件)。

注意

 

如果要为可写的缓冲文件创建内存映射,则应flush()首先使用该文件。这对于确保对映射实际可用的缓冲区的本地修改是必要的。

对于构造函数的Unix和Windows版本,可以将访问指定为可选的关键字参数。access接受四个值中的一个:ACCESS_READ,, ACCESS_WRITEACCESS_COPY分别指定只读,直写或写时复制内存,或者 ACCESS_DEFAULT延迟到prot。 访问可以在Unix和Windows上使用。如果未指定access,则Windows mmap将返回直写映射。所有三种访问类型的初始内存值都取自指定的文件。分配给ACCESS_READ 内存映射会引发TypeError异常。分配给ACCESS_WRITE内存映射会影响内存和底层文件。分配到ACCESS_COPY 内存映射会影响内存,但不会更新基础文件。

在版本3.7中更改:添加ACCESS_DEFAULT常量。

要映射匿名内存,应将-1作为fileno与长度一起传递。

class mmap.mmapfilenolengthtagname = Noneaccess = ACCESS_DEFAULT [,offset ] )

(Windows版)从文件句柄fileno指定的文件中映射长度字节,并创建mmap对象。如果length大于文件的当前大小,则文件将扩展为包含长度 字节。如果length为,则映射的最大长度是文件的当前大小,但如果文件为空,则Windows引发异常(您无法在Windows上创建空映射)。0

tagname,如果指定而不是None,则是一个字符串,给出映射的标记名称。Windows允许您针对同一文件具有许多不同的映射。如果指定现有标记的名称,则会打开该标记,否则将创建此名称的新标记。如果省略此参数None,则创建的映射没有名称。避免使用tag参数将有助于保持代码在Unix和Windows之间可移植。

offset可以指定为非负整数偏移量。mmap引用将相对于文件开头的偏移量。offset 默认为0. offset必须是的倍数ALLOCATIONGRANULARITY

class mmap.mmapfilenolengthflags = MAP_SHAREDprot = PROT_WRITE | PROT_READaccess = ACCESS_DEFAULT [,offset ] )

(Unix版本)从文件描述符fileno指定的文件中映射长度字节,并返回mmap对象。如果length为,则映射的最大长度将是调用时文件的当前大小 。0mmap

flags指定映射的性质。MAP_PRIVATE创建一个私有的写时复制映射,因此对mmap对象内容的更改将对此进程是私有的,并MAP_SHARED创建一个映射,该映射与映射文件相同区域的所有其他进程共享。默认值为MAP_SHARED

PROT,如果指定,得到所需的存储器保护; 两个最有用的值是PROT_READPROT_WRITE,以指定可以读取或写入页面。 prot默认为 。PROT_READ | PROT_WRITE

可以指定访问来代替flagsprot作为可选的关键字参数。指定flagsprot和 access都是错误的。有关如何使用此参数的信息,请参阅上面的访问说明。

offset可以指定为非负整数偏移量。mmap引用将相对于文件开头的偏移量。偏移 的默认值为0 的偏移必须是多的ALLOCATIONGRANULARITY ,它等于PAGESIZE在Unix系统。

为了确保创建的内存映射的有效性,描述符fileno指定的文件在内部自动与Mac OS X和OpenVMS上的物理后备存储同步。

此示例显示了一种简单的使用方法mmap

import mmap

# write a simple example file
with open("hello.txt", "wb") as f:
    f.write(b"Hello Python!\n")

with open("hello.txt", "r+b") as f:
    # memory-map the file, size 0 means whole file
    mm = mmap.mmap(f.fileno(), 0)
    # read content via standard file methods
    print(mm.readline())  # prints b"Hello Python!\n"
    # read content via slice notation
    print(mm[:5])  # prints b"Hello"
    # update content using slice notation;
    # note that new content must have same size
    mm[6:] = b" world!\n"
    # ... and read again using standard file methods
    mm.seek(0)
    print(mm.readline())  # prints b"Hello  world!\n"
    # close the map
    mm.close()

mmap也可以在with 语句中用作上下文管理器:

import mmap

with mmap.mmap(-1, 13) as mm:
    mm.write(b"Hello world!")

3.2版中的新功能:上下文管理器支持。

下一个示例演示如何创建匿名映射并在父进程和子进程之间交换数据:

import mmap
import os

mm = mmap.mmap(-1, 13)
mm.write(b"Hello world!")

pid = os.fork()

if pid == 0:  # In a child process
    mm.seek(0)
    print(mm.readline())

    mm.close()

内存映射文件对象支持以下方法:

close()

关闭mmap。对该对象的其他方法的后续调用将导致引发ValueError异常。这不会关闭打开的文件。

closed

True 如果文件已关闭。

版本3.2中的新功能。

findsub [,start [,end ] ] )

返回找到序列对象的最低索引,使得sub包含在[ startend ] 范围内。可选参数startend被解释为切片表示法。-1失败时的回报。

在版本3.5中更改:现在接受可写的字节对象

flush([ offset [,size ] ] )

将对文件的内存中副本所做的更改刷新回磁盘。不使用此调用,无法保证在对象被销毁之前写回更改。如果指定了offsetsize,则只将对给定字节范围的更改刷新到磁盘; 否则,映射的整个范围都会被刷新。offset必须是PAGESIZEor 的倍数 ALLOCATIONGRANULARITY

(Windows版本)返回的非零值表示成功; 零表示失败。

(Unix版本)返回零值表示成功。呼叫失败时会引发异常。

movedestsrccount 

将从offset src开始的计数字节复制到目标索引 dest。如果使用mmap创建,则调用move将引发异常。ACCESS_READTypeError

read([ ] )

从当前文件位置开始返回bytes包含最多n个字节的内容。如果省略参数None或为负,则将所有字节从当前文件位置返回到映射的末尾。文件位置更新为指向返回的字节之后。

在版本3.3中更改:参数可以省略或None

read_byte()

以整数形式返回当前文件位置的字节,并将文件位置前进1。

readline()

返回单行,从当前文件位置开始直到下一个换行符。

resize新闻

调整地图和基础文件的大小(如果有)。如果使用ACCESS_READ或创建mmap ACCESS_COPY,则调整地图大小将引发TypeError异常。

rfindsub [,start [,end ] ] )

返回找到序列的对象中的最高索引,使得sub包含在[ startend ] 范围内。可选参数startend被解释为切片表示法。-1失败时的回报。

在版本3.5中更改:现在接受可写的字节对象

seekpos [,whence ] )

设置文件的当前位置。 whence参数是可选的,默认为os.SEEK_SET0(绝对文件定位); 其他值是os.SEEK_CUR1(相对于当前位置寻找)和/ os.SEEK_END2(相对于文件的末尾寻找)。

size()

返回文件的长度,该长度可能大于内存映射区域的大小。

tell()

返回文件指针的当前位置。

write字节

将字节以字节为单位写入文件指针当前位置的内存中,并返回写入的字节数(从不小于 len(bytes),因为如果写入失败,ValueError将引发a)。文件位置更新为指向写入的字节之后。如果使用mmap创建ACCESS_READ,则写入它将引发TypeError异常。

在版本3.5中更改:现在接受可写的字节对象

在版本3.6中更改:现在返回写入的字节数。

write_byte字节

将整数字节写入文件指针当前位置的内存中; 文件位置是先进的1。如果使用mmap创建ACCESS_READ,则写入它将引发TypeError异常。

转载于:https://my.oschina.net/u/3612528/blog/3050970

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值