mmap是一种虚拟内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。
优点:
- 普通文件被映射到虚拟地址空间后,程序可以向访问普通内存一样对文件进行访问,在有些情况下可以提高IO效率
- 它占用物理内存空间少,可以解决内存空间不足的问题,适合处理超大文件
mmap在Windows和Linux平台上的行为有所不同。例如,Windows不支持创建空映射。
Python通过mmap模块支持文件内存映射,文档:https://docs.python.org/3.5/library/mmap.html。
读操作
import mmap
f = open('test.txt', 'r') # r->读
""" mmap用来创建内存映射文件
第一个参数是文件描述符
第二个参数是映射长度,0代表整个文件
第三个参数是访问模式,ACCESS_READ:读;ACCESS_WRITE:写:
ACCESS_COPY:写时复制,不会把更改写入到文件,使用flush把更改写到文件
"""
with mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) as m:
print('读取前10个字节 :', m.read(10))
print('还可以像操作字符串一样操作:', m[:10])
print('下一个10字节 :', m.read(10))
# mm.close()
f.close()
写操作
import mmap
word = b'World'
reversed = word[::-1]
print('查找:', word)
print('替换:', reversed)
with open('test.txt', 'r+') as f: # r+,不是w
with mmap.mmap(f.fileno(), 0) as m:
m.seek(0) # 定位到文件头
loc = m.find(word)
m[loc:loc + len(word)] = reversed
m.flush()
内存映射文件可以像字符串一样操作,我们可以在其上应用正则表达式。
来源:http://blog.topspeedsnail.com/archives/10036#more-10036