mmap内存映射文件支持


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

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

注意

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

对于Unix和Windows版本的构造函数,access可以指定为可选的关键字参数。access接受四个值之一:ACCESS_READ, ACCESS_WRITE,或ACCESS_COPY分别指定只读,直写或写时复制内存,或者ACCESS_DEFAULT推迟prot. access可以在Unix和Windows上使用。如果access未指定,Windows mmap返回awrite-through映射。所有三种访问类型的初始内存值均取自指定的文件。分配到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版)映射length来自文件句柄fileno指定的文件的字节,并创建一个mmap对象。如果length大于文件的当前大小,则文件扩展为包含length字节。如果length0,则地图的最大长度是文件的当前大小,但如果文件为空则Windows会引发异常(您无法在Windows上创建空映射).

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

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

class mmap.mmapfileno, length, flags=MAP_SHARED, prot=PROT_WRITE|PROT_READ, access=ACCESS_DEFAULT [, offset] )的倍数

(Unix版)映射length来自filedescriptor fileno指定的文件的字节,并返回一个mmap对象。如果length0,当mmap被调用时,地图的最大长度将是文件的当前大小.

flags指定映射的性质。MAP_PRIVATE创建了aprivate copy-on-write映射,因此对mmapobject内容的更改将对此进程是私有的,并且MAP_SHARED会创建与映射相同区域的所有其他进程共享的amapping。文件。默认值为MAP_SHARED.

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

access可以指定代替flagsprot作为optionalkeyword参数。指定flags, protaccess。见的描述access以上是关于如何使用此参数的信息.

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

确保创建的内存映射的有效性由描述符fileno内部自动与Mac OS X和OpenVMS上的物理后备存储同步.

这个例子展示了一个使用mmap

import mmap# write a simple example filewith 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 mmapwith mmap.mmap(-1, 13) as mm:    mm.write(b"Hello world!")

版本3.2中的新内容:上下文管理器支持

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

import mmapimport osmm = 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.

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

返回子序列sub发现的对象中的最低索引,这样sub就包含在[start, end可选参数startend被解释为切片符号。回复-1失败时

更改版本3.5:可写字节对象现已被接受.

flush ([offset [, size] ]

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

Windows版)返回非零值表示成功;zero表示失败.

(Unix版本)返回零值表示成功。呼叫失败时会出现异常情况.

move(dest, src, count)

复制count字节从偏移src开始到目的地索引dest。如果mmap是用ACCESS_READ创建的,那么调用tomove将会引发一个TypeError exception.

read ( [n]

从当前文件位置开始,返回一个包含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]。可选参数startend被解释为切片符号。回复-1失败时

更改版本3.5:可写字节对象现在已被接受.

seek (pos [, whence])

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

size

返回文件的长度,可以大于文件的大小记忆图区域.

tell ( )

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

write (bytes )

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

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

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

write_byte (byte

将整数byte写入文件指针当前位置的内存中;文件位置按1前进。如果mmap是用ACCESS_READ创建的,那么写入它就会得到TypeError异常

评论被关闭。