– 内存映射文件支持 – 网络和进程间通信(Python教程)(参考资料)
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字节。如果length是
0
,则地图的最大长度是文件的当前大小,但如果文件为空则Windows会引发异常(您无法在Windows上创建空映射).tagname,如果指定而不是
None
,是一个字符串,给出映射的标记名称。Windows允许您针对同一文件具有许多不同的映射。如果指定现有标记的名称,则打开该标记,否则将创建此名称的新标记。如果此参数isomitted或None
,则创建的映射没有名称。避免使用tag参数将有助于保持代码在Unix和Windows之间可移植.offset可以指定为非负整数偏移量。mmap references将相对于文件开头的偏移量。offset默认为0. offset必须是
ALLOCATIONGRANULARITY
.
- class
mmap.
mmap
(fileno, length, flags=MAP_SHARED, prot=PROT_WRITE|PROT_READ, access=ACCESS_DEFAULT [, offset] )的倍数 -
(Unix版)映射length来自filedescriptor fileno指定的文件的字节,并返回一个mmap对象。如果length是
0
,当mmap
被调用时,地图的最大长度将是文件的当前大小.flags指定映射的性质。
MAP_PRIVATE
创建了aprivate copy-on-write映射,因此对mmapobject内容的更改将对此进程是私有的,并且MAP_SHARED
会创建与映射相同区域的所有其他进程共享的amapping。文件。默认值为MAP_SHARED
.prot,如果指定,则提供所需的内存保护;两个最有用的值是
PROT_READ
和PROT_WRITE
,以指定可以读取或写入页面。prot默认为PROT_READ | PROT_WRITE
.access可以指定代替flags和prot作为optionalkeyword参数。指定flags, prot和access。见的描述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()
closed
-
True
/版本3.2.
find
(sub [, start [, end]])-
返回子序列sub发现的对象中的最低索引,这样sub就包含在[start, end可选参数start和end被解释为切片符号。回复
-1
失败时
flush
([offset [, size] ] )-
将对文件的内存中副本所做的更改刷新回磁盘。如果不使用此调用,则无法保证在对象被销毁之前写回更改。如果offset和size如果指定,只更改给定的字节范围将被刷新到磁盘;否则,刷新映射的整个范围。offset必须是
PAGESIZE
或ALLOCATIONGRANULARITY
.(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
()-
返回一行,开始在当前文件位置和下一个换行符
rfind
// (sub [, start [, end] ] )-
返回子序列sub发现,这样sub包含在[start, end]。可选参数start和end被解释为切片符号。回复
-1
失败时更改版本3.5:可写字节对象现在已被接受.
seek
(pos [, whence])-
设置文件的当前位置。whence参数是可选的,默认为
os.SEEK_SET
或0
(绝对文件定位);其他值是os.SEEK_CUR
或1
(相对于当前位置寻找)和os.SEEK_END
或2
(相对于文件的末尾).
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
异常
评论被关闭。