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_READ
, ACCESS_WRITE
或 ACCESS_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__
带着论据fileno
,length
,access
,offset
.
- 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_READ
和PROT_WRITE
,指定可以读取或写入页面。 prot 默认为PROT_READ | PROT_WRITE
.接近 可指明代替 flags 和 prot 作为可选关键字参数。指定两者都是错误的 flags , prot 和 接近 . 参见的说明 接近 有关如何使用此参数的信息,请参见上文。
抵消 可以指定为非负整数偏移量。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()
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__
带着论据fileno
,length
,access
,offset
.内存映射文件对象支持以下方法:
- 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 如果指定,则只有对给定字节范围的更改才会刷新到磁盘;否则,将刷新映射的整个范围。 抵消 必须是
PAGESIZE
或ALLOCATIONGRANULARITY
.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()¶
返回一行,从当前文件位置开始直到下一个换行符。文件位置将更新为指向返回的字节之后。
- rfind(sub[, start[, end]])¶
返回对象中的最高索引,其中 sub 被发现,这样 sub 包含在范围内 [start, end] . 可选参数 开始 和 end 被解释为切片符号。返回
-1
失败论。在 3.5 版更改: 可写的 bytes-like object 现在被接受。
- seek(pos[, whence])¶
设置文件的当前位置。 何处 参数是可选的,默认为
os.SEEK_SET
或0
(绝对文件定位);其他值为os.SEEK_CUR
或1
(相对于当前位置搜索)和os.SEEK_END
或2
(相对于文件结尾查找)。
- size()¶
返回文件的长度,该长度可以大于内存映射区域的大小。
- tell()¶
返回文件指针的当前位置。
- write(bytes)¶
写入字节 字节 在文件指针的当前位置进入内存并返回写入的字节数(不小于
len(bytes)
,因为如果写入失败,ValueError
将被引发)。文件位置将更新到写入的字节之后。如果mmap是用ACCESS_READ
,那么给它写信会提高TypeError
例外。在 3.5 版更改: 可写的 bytes-like object 现在被接受。
在 3.6 版更改: 现在返回写入的字节数。
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 新版功能.