第六章:文件系统-mmap:内存映射文件-读文件

6.9 mmap:内存映射文件
建立一个文件的内存映射将使用操作系统虚拟内存来直接访问文件系统上的数据,而不是使用常规的I/O函数访问。内存映射通常可以提高I/O性能,因为使用内存映射时,不需要对每个访问都建立一个单独的系统调用,也不需要在缓冲区之间复制数据;实际上,内核和用户应用都能直接访问内存。
内存映射文件可以看作是可修改的字符串或类似文件的对象,这取决于具体的需要。映射文件支持一般的文件API方法,如close(),flush(),read(),readline(),seek(),tell()和write()。它还支持字符串API,提供分片等特性以及类似find()的方法。
下面的所有示例都会使用文本文件lorem.txt,其中包含一些Lorem Ipsum。为便于参考,下面的代码清单给出这个文件的文本。
lorem.txt:
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas porttitor congue massa. Fusce posuere, magna sed pulvinar ultricies, purus lectus malesuada libero, sit amet commodo magna eros quis urna. Nunc viverra imperdiet enim. Fusce est. Vivamus a tellus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Proin pharetra nonummy pede. Mauris et orci. Aenean nec lorem. In porttitor. Donec laoreet nonummy augue. Suspendisse dui purus, scelerisque at, vulputate vitae, pretium mattis, nunc. Mauris eget neque at sem venenatis eleifend. Ut nonummy. Fusce aliquet pede non pede.

6.9.1 读文件
使用mmap()函数可以创建一个内存映射文件。第一个参数是文件描述符,可能来自file对象的fileno()方法,也可能来自os.open()。调用者在调用mmap()之间负责打开文件,不再需要文件时要负责将其关闭。
mmap()的第二个参数是要映射的文件部分的大小(以字节为单位)。如果这个值为0,则映射整个文件。如果这个大小大于文件的当前大小,则会扩展该文件。

说明:Windows平台不支持创建长度为0的映射。

这两个平台都支持一个可选的关键字参数access。使用ACCESS_READ表示只读访问;ACCESS_WRITE表示“写通过”(write-through),即对内存的赋值直接写入文件;ACCESS_COPY表示“写时复制”(copy-on-write),对内存的赋值不会写至文件。

import mmap

with open('lorem.txt','r') as f:
    with mmap.mmap(f.fileno(),0,access=mmap.ACCESS_READ) as m:
        print('First 10 bytes via read :',m.read(10))
        print('First 10 bytes via slice:',m[:10])
        print('2nd   10 bytes via read :',m.read(10))

文件指针会跟踪通过一个分片操作访问的最后一个字节。在这个例子中,第一次读之后,指针向前移动10个字节。然后由分片操作将指针重置回文件的起始位置,并由分片使指针再次向前移动10个字节。分片操作之后,再调用read()会给出文件的11~20字节。
运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43193719/article/details/88647437