mmap:内存映射文件
楔子
建立一个文件的内存映射将使用操作系统虚拟内存来直接访问文件系统上的数据,而不是使用常规的I/O函数访问数据。 内存映射通常可以提高I/O性能,因为使用内存映射时,不需要对每一个访问都建立一个单独的系统调用,也不需要你在缓冲区之间复制数据。
实际上内核和用户应用都能直接访问内存。 内存映射文件可以看做是可修改的字符串或类似文件的对象,这取决于具体的需要。 映射文件支持一般文件的API方法,如close、flush、read、readline、seek、tell、write。而且还支持字符串的API,提供切片等特性以及类似find的方法 。
文件如下:

读文件
使用mmap函数可以创建一个内存映射文件。第一个参数是文件描述符,可以来自file对象的fileno方法,也可以来自os.open。
调用者在调用mmap方法之前负责打开文件,不再需要文件时要负责将其关闭。
mmap函数的第二个参数是要映射的文件部分的大小(以字节为单位)。如果这个值为0,则映射整个文件,如果这个大小大于文件的当前大小,则会扩展该文件。
import mmap
with open("1.txt", "r", encoding="utf-8") as f:
'''
有一个可选的参数access。使用ACCESS_READ表示只读访问;
当然还有写,但是说实话,写的话不常用
'''
# 我们这里是读文件所以是mmap.ACCESS_READ
with mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) as m:
print(m) # <mmap.mmap object at 0x0000025FDA97A150>
直接打印的话,显示的是一个mmap.mmap对象,这个对象内部支持普通文件的一些api。
read方法:
import mmap
with open("1.txt", "r", encoding="utf-8") as f:
with mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) as m:
# 调用m.read()得到文件内容,以字节的形式
print(m.read().decode("utf-8"))
"""
你怎么这么熟练啊!
晨意微寒秋渐深,侧伴无事俏佳人
为了我,你就永远当个废物吧;为了能让我好好努力,就一生,都成为我的负担吧。
我喜欢这个世界上最糟糕的你,最喜欢了。
第一次,有了喜欢的人,还得到了一生的挚友,两份喜悦相互重叠,这双重的喜悦又带来了更多更多的喜悦
是我,是我先,明明都是我先来的,接吻也好,拥抱也好,还是喜欢上那家伙也好
"""
# 由于读取完毕,所以再次读取得到的是空字节
print(m.read()) # b''
readline方法:
import mmap
with open("1.txt", "r", encoding="utf-8") as f:
with mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) as m:
# readline,按照行读取
for _ in range(3):
print(m.readline().decode("utf-8"))
"""
你怎么这么熟练啊!
晨意微寒秋渐深,侧伴无事俏佳人
为了我,你就永远当个废物吧;为了能让我好好努力,就一生,都成为我的负担吧。
"""
# 由于有换行符,所以会有空行
size方法:
import mmap
with open("1.txt", "r", encoding="utf-8") as f:
with mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) as m:
# 这个是查看文件的字节数,注意:是使用utf-8转换成字节所对应的字节数
print(m.size()) # 499
当然也支持tell方法,表示当前文件指针所在的位置;以及seek,移动的文件的某个位置。
mmap.mmap对象最大的特点是支持像字符串一样访问数据,我们来看一下:
import mmap
with open("1.txt", "r", encoding="utf-8") as f:
with mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) as m:
print(m.read(9).decode("utf-8")) # 你怎么
print(m[0: 9].decode("utf-8")) # 你怎么
print(m.read(9).decode("utf-8")) # 这么熟
可以看到可以通过切片访问指定位置的内容,另外通过read访问也是可以的。通过read访问,会使得指针移动,但是切片无论何时都是从头读取,并且对文件指针的移动没有任何影响。
但是由于不同的字符占据不同的编码,比如汉字一个字符占三个字节,那么我们截取的时候要是3的整倍数。但如果是中英文混合的话,就比较尴尬了,所以这种方式比较适合纯ascii文本。
此外mmap.mmap对象还支持通过find和rfind定位指定字符所在的位置。
mmap:内存映射文件的更多相关文章
- mmap - 内存映射文件 - 减少一次内核空间内数据向用户空间数据拷贝的操作
关于mmap 网上有很多有用的文章,我这里主要记录,日常使用到mmap时的理解: https://www.cnblogs.com/huxiao-tee/p/4660352.html 测试代码: htt ...
- linux mmap 内存映射【转】
转自:http://blog.csdn.net/xyyangkun/article/details/7830313 [-] mmap vs readwritelseek mmap vs malloc ...
- linux mmap 内存映射
mmap() vs read()/write()/lseek() 通过strace统计系统调用的时候,经常可以看到mmap()与mmap2().系统调用mmap()可以将某文件映射至内存(进程空间), ...
- python标准库基础之mmap:内存映射文件
#作用:建立内存映射文件而不是直接读取内容文本信息内容:如下(名称是text.txt) Lorem ipsum dolor sit amet, consectetuer adipiscing elit ...
- Python之mmap内存映射模块(大文本处理)说明
背景: 通常在UNIX下面处理文本文件的方法是sed.awk等shell命令,对于处理大文件受CPU,IO等因素影响,对服务器也有一定的压力.关于sed的说明可以看了解sed的工作原理,本文将介绍通过 ...
- 【转】Python之mmap内存映射模块(大文本处理)说明
[转]Python之mmap内存映射模块(大文本处理)说明 背景: 通常在UNIX下面处理文本文件的方法是sed.awk等shell命令,对于处理大文件受CPU,IO等因素影响,对服务器也有一定的压力 ...
- NET 4 中 内存映射文件
原文链接 : http://blogs.msdn.com/salvapatuel/archive/2009/06/08/working-with-memory-mapped-files-in-net- ...
- 内存映射文件(Memory-Mapped File)
Java Memory-Mapped File所使用的内存分配在物理内存而不是JVM堆内存,且分配在OS内核. 1: 内存映射文件及其应用 - 实现一个简单的消息队列 / 计算机程序的思维逻辑 在一般 ...
- JAVA I/O(三)内存映射文件
<Java编程思想>中对内存映射文件有详细的介绍,此处仅做简单记录和总结.内存映射文件允许创建和修改因为太大而不能放入内存的文件. 1. 内存映射文件简单实例 import java.io ...
随机推荐
- forge k8s/kubernetes ci/cd 最佳实践
forge的官网是: http://forge.sh forge工具是一个部署工具, 将你的应用自动更新到kubernets集群中, 只需要配置简洁的配置文件和模板即可. 其它的就交给forge, 它 ...
- django的邮件email功能
注意 测试的时候python manage.py test -p "test_tasks.py" -v 3,默认使用的EMAIL_BACKEND配置为:'django.core.m ...
- webdriervAPI(鼠标事件)
from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains 导 ...
- JetsonTx2刷机
Jetson TX2是有NVIDIA发布的一款Som(Ssytem on Module)嵌入式设备,该设备包含双核的丹弗2(NVIDIA Denver2)CPU和4个Cortex-A57的ARM核心, ...
- JAVA数据结构和算法 6 递归
递归:直接或者间接地调用自己.比如计算连续数的阶乘,计算规律:n!=(n-1)!*n. 每个递归方法都有一个基值(终止)条件,以防止无线地递归下去,以及由此引发的程序崩溃. 采用递归是因为它可以从概念 ...
- 配置zabbix监控windows,cmd运行报错cannot connect to Service Manager: [0x00000005]
错误原因: cmd运行没有管理员权限 解决: 找到cmd.exe的位置C:\Windows\System32,选中--右键--使用管理员身份运行 再通过cmd进入到zabbix_agentd文件夹进行 ...
- Java High Level REST Client 之 创建索引
1. 创建索引请求 CreateIndexRequest request = new CreateIndexRequest("twitter"); 2.设置 2.1 分别设置 2. ...
- TensorFlow.资料
1.ZC:看来 要用 TensorFlow,基本逃不过 Python了... TensorFlow物体识别——通过机器学习搭建属于自己的物体识别库 - 迷途无归的博客 - CSDN博客.html(h ...
- 初识gRPC
一.gRPC的概念 gRPC是Google推出的一个开源高性能的轻量级RPC框架,可以在任何环境中运行.它可以有效地连接数据中心内和跨数据中心的服务,并提供可插拔的支持,以实现负载平衡,跟踪,健康检查 ...
- HTML的列表表格表单知识点
无序列表格式 ...