mmap ---内存映射文件支持


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

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

注解

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

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

在 3.7 版更改: 补充 ACCESS_DEFAULT 常数。

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

class mmap.mmap(fileno, length, tagname=None, access=ACCESS_DEFAULT[, offset])

(Windows版本) 地图 长度 文件句柄指定的文件中的字节数 文件描述符 ,并创建mmap对象。如果 长度 大于文件的当前大小,文件被扩展为包含 长度 字节。如果 长度0 ,映射的最大长度是文件的当前大小,但如果文件为空,则Windows会引发异常(不能在Windows上创建空映射)。

标记名 ,如果有规定和没有 None ,是为映射提供标记名的字符串。Windows允许您对同一文件进行许多不同的映射。如果指定现有标记的名称,则打开该标记,否则将创建此名称的新标记。如果省略此参数,或 None 创建的映射没有名称。避免使用标记参数将有助于在UNIX和Windows之间保持代码的可移植性。

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

提出一个 auditing event mmap.__new__ 带着论据 filenolengthaccessoffset .

class mmap.mmap(fileno, length, flags=MAP_SHARED, prot=PROT_WRITE|PROT_READ, access=ACCESS_DEFAULT[, offset])

(Unix版本) 地图 长度 文件描述符指定的文件中的字节数 文件描述符 ,并返回mmap对象。如果 长度0 ,映射的最大长度将是文件的当前大小,当 mmap 被称为。

旗帜 指定映射的性质。 MAP_PRIVATE 在写映射时创建一个私有副本,因此对mmap对象内容的更改对于此进程是私有的,并且 MAP_SHARED 创建与映射文件相同区域的所有其他进程共享的映射。默认值为 MAP_SHARED . 某些系统具有附加的可能标志,其完整列表在 MAP_* constants .

prot 如果指定,则提供所需的内存保护;最有用的两个值是 PROT_READPROT_WRITE ,指定可以读取或写入页面。 prot 默认为 PROT_READ | PROT_WRITE .

接近 可指明代替 flagsprot 作为可选关键字参数。指定两者都是错误的 flagsprot接近 . 参见的说明 接近 有关如何使用此参数的信息,请参见上文。

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

要确保创建的内存映射的有效性,请使用描述符指定的文件 文件描述符 在内部自动与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()

提出一个 auditing event mmap.__new__ 带着论据 filenolengthaccessoffset .

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

close()

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

closed

True 如果文件已关闭。

3.2 新版功能.

find(sub[, start[, end]])

返回对象中的最低索引,其中 sub 被发现,这样 sub 包含在范围内 [start, end] . 可选参数 开始end 被解释为切片符号。返回 -1 失败论。

在 3.5 版更改: 可写的 bytes-like object 现在被接受。

flush([offset[, size]])

将对文件的内存中副本所做的更改刷新回磁盘。如果不使用此调用,则无法保证在销毁对象之前将更改写回原处。如果 抵消size 如果指定,则只有对给定字节范围的更改才会刷新到磁盘;否则,将刷新映射的整个范围。 抵消 必须是 PAGESIZEALLOCATIONGRANULARITY .

None 返回以指示成功。调用失败时引发异常。

在 3.8 版更改: 以前,成功时返回非零值;Windows下的错误时返回零。成功时返回零值;在Unix下发生错误时引发异常。

madvise(option[, start[, length]])

发送建议 选项 到内核关于从开始的内存区域 开始 和延伸 长度 字节。 选项 一定是 MADV_* constants 在系统上可用。如果 开始长度 如果省略,则会跨越整个映射。在某些系统(包括Linux)上, 开始 必须是 PAGESIZE .

可用性:系统 madvise() 系统调用。

3.8 新版功能.

move(dest, src, count)

复制 计数 从偏移量开始的字节数 src 目标索引 dest . 如果mmap是用 ACCESS_READ ,则移动调用将引发 TypeError 例外。

read([n])

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

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

read_byte()

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

readline()

返回一行,从当前文件位置开始直到下一个换行符。文件位置将更新为指向返回的字节之后。

resize(newsize)

调整映射和基础文件的大小(如果有)。如果mmap是用 ACCESS_READACCESS_COPY ,调整地图大小将引发 TypeError 例外。

rfind(sub[, start[, end]])

返回对象中的最高索引,其中 sub 被发现,这样 sub 包含在范围内 [start, end] . 可选参数 开始end 被解释为切片符号。返回 -1 失败论。

在 3.5 版更改: 可写的 bytes-like object 现在被接受。

seek(pos[, whence])

设置文件的当前位置。 何处 参数是可选的,默认为 os.SEEK_SET0 (绝对文件定位);其他值为 os.SEEK_CUR1 (相对于当前位置搜索)和 os.SEEK_END2 (相对于文件结尾查找)。

size()

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

tell()

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

write(bytes)

写入字节 字节 在文件指针的当前位置进入内存并返回写入的字节数(不小于 len(bytes) ,因为如果写入失败, ValueError 将被引发)。文件位置将更新到写入的字节之后。如果mmap是用 ACCESS_READ ,那么给它写信会提高 TypeError 例外。

在 3.5 版更改: 可写的 bytes-like object 现在被接受。

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

write_byte(byte)

写整数 byte 在文件指针的当前位置进入内存;文件位置由 1 . 如果mmap是用 ACCESS_READ ,那么给它写信会提高 TypeError 例外。

madv_ux常量

mmap.MADV_NORMAL
mmap.MADV_RANDOM
mmap.MADV_SEQUENTIAL
mmap.MADV_WILLNEED
mmap.MADV_DONTNEED
mmap.MADV_REMOVE
mmap.MADV_DONTFORK
mmap.MADV_DOFORK
mmap.MADV_HWPOISON
mmap.MADV_MERGEABLE
mmap.MADV_UNMERGEABLE
mmap.MADV_SOFT_OFFLINE
mmap.MADV_HUGEPAGE
mmap.MADV_NOHUGEPAGE
mmap.MADV_DONTDUMP
mmap.MADV_DODUMP
mmap.MADV_FREE
mmap.MADV_NOSYNC
mmap.MADV_AUTOSYNC
mmap.MADV_NOCORE
mmap.MADV_CORE
mmap.MADV_PROTECT
mmap.MADV_FREE_REUSABLE
mmap.MADV_FREE_REUSE

这些选项可以传递给 mmap.madvise() . 并非每个系统都有每个选项。

可用性:具有madvise()系统调用的系统。

3.8 新版功能.

映射常数

mmap.MAP_SHARED
mmap.MAP_PRIVATE
mmap.MAP_DENYWRITE
mmap.MAP_EXECUTABLE
mmap.MAP_ANON
mmap.MAP_ANONYMOUS
mmap.MAP_POPULATE

这些是可以传递给 mmap.mmap() . 请注意,某些系统上可能不存在某些选项。

在 3.10 版更改: 添加了MAP_POPULATE常量。