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 ...
随机推荐
- 【Fiori系列】为什么SAP Fiori活的如此精致
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[Fiori系列]为什么SAP Fiori活的如 ...
- linux ssh利用公钥免密登陆
1.安装检查ssh 如果没有ssh的话,需要安装 #yum install -y openssh-server openssh-clients 2.生成秘钥 ssh-keygen -t rsa 执行 ...
- 《精通并发与Netty》学习笔记(12 - 详解NIO (三) SocketChannel、Pipe)
一.SocketChannelJava NIO中的SocketChannel是一个连接到TCP网络套接字的通道.可以通过以下2种方式创建SocketChannel: 打开一个SocketChannel ...
- VS开发】C中调用C++文件中定义的function函数
[VS开发]C中调用C++文件中定义的function函数 标签(空格分隔): [VS开发] 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 精要一揽 C调用 ...
- thymeleaf如何遍历数据 each循环的使用
首先在html开始标签中引入一个属性 xmlns:th="http://www.thymeleaf.org" 遍历数据示例 <tbody> <tr th:each ...
- bootstrap基础学习【表单含按钮】(二)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Java反射:Web学习的灵魂
反射:Web学习的灵魂 我们从最初的 javac -HelloWorld.java,到面向对象部分,我们可以将Java代码在计算机中经历的阶段分为三部分:Scource源代码阶段 -- Class类对 ...
- SQLSERVER 查看服务器IP地址的命令
今天进行负载均衡的测试的时候 想查询一下数据库相关信息 百度了下 找到解决方案为: SELECT SERVERNAME = CONVERT(NVARCHAR(),SERVERPROPERTY('SER ...
- HttpServletResponse对象(转)
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象.request和response对象即然代表请求和响应,那我们要 ...
- 报错Could not find resource cn/smbms/dao/provider/ProviderMapper.xml
原因:由于idea不会编译src下的java目录下的xml文件,所以找不到xml文件 方案一:在pom.xml中添加如下内容 <build> <resources> <r ...