mmap —内存 Map 文件支持


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

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

Note

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

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

在 3.7 版中进行了更改:添加了ACCESS_DEFAULT常量。

要 Map 匿名内存,应将-1 作为文件名和长度一起传递。

用参数filenolengthaccessoffset引发auditing event mmap.__new__

可以指定* access 代替 flags 和* prot 作为可选关键字参数。同时指定 flags,* prot access 都是错误的。有关如何使用此参数的信息,请参见上面对 access *的描述。

为确保创建的内存 Map 的有效性,Descriptors* 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语句中用作上下文 Management 器:

import mmap

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

版本 3.2 中的新Function:上下文 Management 器支持。

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

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()

用参数filenolengthaccessoffset引发auditing event mmap.__new__

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

3.2 版中的新Function。

在版本 3.5 中更改:现在接受可写bytes-like object

None返回表示成功。呼叫失败时引发异常。

在 3.8 版中进行了更改:以前,成功返回非零值; Windows 下的错误返回零。成功返回零值。在 Unix 下,由于错误而引发了异常。

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

3.8 版的新Function。

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

在版本 3.5 中更改:现在接受可写bytes-like object

在版本 3.5 中更改:现在接受可写bytes-like object

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

MADV_* Constants

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

3.8 版的新Function。

首页