python mmap
本质:
将文件映射到内存,进行直接对内存进行读写(当关闭mmap时内存映射才写入到文件,中间的操作都是在内存)
优点:
1.直接读写内存,不需要任何数据拷贝。管道消息队列需要在内核和用户空间进行四次数据拷贝,而共享内存只拷贝两次数据(一次是文件到共享内存,一次是从共享内存到输出文件上)
缺点:
Windows: mmap(fileno, length[, tagname[, access[, offset]]])
Unix: mmap(fileno, length[, flags[, prot[, access[, offset]]]])
参数 | 描述 |
---|---|
fileno | 文件描述符file对象的fileno()方法 |
length | 映射的长度,0表示全部映射 |
flags | |
prot | |
access | ACCESS_READ:读访问;ACCESS_WRITE:写访问,默认;ACCESS_COPY:拷贝访问,不会把更改写入到文件,使用flush把更改写到文件 |
方法 | 描述 |
---|---|
close() | 关闭映射 |
m.find(str, start=0) | 从start开始,从左到右寻找str,返回下标 |
m.flush([offset, n]) |
从offset开始的n个字节刷到对应的文件中,开启ACCESS_COPY 时使用
|
move(dstoff, srcoff, n) | 从 srcoff 开始的 n 个字节复制到从 dstoff 开始的n个字节 |
read(n) | m 对应的文件中最多读取 n 个字节,当前位置后移动 |
read_byte() | |
readline() | |
seek(pos, how=0) | 改变当前位置 |
size() | 文件的长度 |
tell() | 返回当前位置 |
write(str) | |
write_byte(byte) |
1.基本使用
import mmap#1.先创建一个文件
with open('hello.txt', 'wb') as f:f.write(b"Hello Python!\n")
#2.将文件与文件进行映射
with open('hello.txt', 'r+b') as f:mm = mmap.mmap(f.fileno(), 0) # f.fileno()文件描述符,size为0表示读取整个文件print(mm.readline()) # prints "Hello Python!" # 标准读取方式print(mm[:5]) # prints "Hello"# 切片读取方式mm[6:] = b" world!\n"mm.seek(0)# 使用seek定位光标到数据头,当前光标已到数据末(mm.tell()可获取当前光标)print(mm.readline()) # prints "Hello world!"# 再次标准读取mm.close()# 像处理文件一样关闭mmap映射
2.父子进程通信
import mmap
import os
import timemm = mmap.mmap(-1, 27)#传入文件描述符-1,使用匿名映射
mm.write(b"Original msg") # 涉及mm的读写都要记得字符串的二进制
print('write successfully')pid = os.fork()if pid == 0: # 子进程中mm.seek(0)print('Read from the mmap:')print(mm.readline())#以切片访问时,严格按照字符串长度mm[12:] = b' sth from child'mm.close()
else:time.sleep(2)# 用sleep使子进程先执行mm.seek(0)print('Read from the child:')print(mm.readline())mm.close()
3.无关进程linux的通信
import mmap
import contextlib
import timewith open("mmap.file", "w") as f:f.write('\x00' * 1024)with open('mmap.file', 'r+') as f:m = mmap.mmap(f.fileno(), 1024, access=mmap.ACCESS_WRITE)for i in range(1, 10001):m.seek(0)m.write(b"hello")m.flush()time.sleep(1)
import mmap
import contextlib
import timewhile True:with open('mmap.file', 'r') as f:with contextlib.closing(mmap.mmap(f.fileno(), 1024, access=mmap.ACCESS_READ)) as m:s = m.read().replace(b'\x00',b'')print(s)time.sleep(1)
4.无关进程win通信
server.py
import mmap
import contextlib
import timewith contextlib.closing(mmap.mmap(-1, 1024, tagname='test', access=mmap.ACCESS_WRITE)) as m:for i in range(1, 10001):m.seek(0)m.write("msg " + str(i))m.flush()time.sleep(1)
client.py
import mmap
import contextlib
import timewhile True:with contextlib.closing(mmap.mmap(-1, 1024, tagname='test', access=mmap.ACCESS_READ)) as m:s = m.read(1024).replace('\x00', '')print stime.sleep(1)
参考:
https://www.xuebuyuan.com/3189076.html
https://docs.python.org/zh-cn/3.9/library/mmap.html
https://blog.csdn.net/zdy0_2004/article/details/53200250
https://blog.csdn.net/m0_37422289/article/details/79895526
https://blog.csdn.net/m0_37422289/article/details/79895526
python mmap相关推荐
- python mmap对象
----使用内存映射的原因 为了随机访问文件的内容,使用mmap将文件映射到内存中是一个高效和优雅的方法.例如,无需打开一个文件并执行大量的seek(),read(),write()调用,只需要简单的 ...
- python slice是共享内存吗_python共享内存实现进程通信
1.概述 共享内存可以说是最有用的进程间通信方式.两个不同的进程共享内存的意思是:同一块物理内存被映射到两个进程的各自的进程地址空间.一个进程可以及时看到另一个进程对共享内存的更新,反之亦然.采用共享 ...
- python 系统编程
进程 进程|Process|Pool|Event|os.fork|zombies|getpid 共享数据|Lock|Semaphore|线程安全对象 subprocess|os.system|os.e ...
- Android C++ Native 内存泄露检查工具Raphael使用介绍
Android C++ Native 内存泄露检查工具使用介绍 实现原理 使用方法 Raphael添加到测试apk 添加项目依赖 同步gradle 启动泄露检测功能 直接使用boardcast功能控制 ...
- python mmap_python mmap对象
----使用内存映射的原因 为了随机访问文件的内容,使用mmap将文件映射到内存中是一个高效和优雅的方法.例如,无需打开一个文件并执行大量的seek(),read(),write()调用,只需要简单的 ...
- Python将文件映射到内存使用mmap.mmap()函数
1.如何将文件映射到内存 实际案例: (1)在访问某些二进制文件时,希望能把文件映射到内存中,可以实现随机访问.(framebuffer设备文件) (2)某些嵌入式设备,寄存器被编址到内存地址空间,我 ...
- python字符串类库_Python 常用类库
python除了关键字(keywords)和内置的类型和函数(builtins),更多的功能是通过libraries(即modules)来提供的. 常用的libraries(modules)如下: 1 ...
- Python并发编程实例教程
有关Python中的并发编程实例,主要是对Threading模块的应用,文中自定义了一个Threading类库. 一.简介 我们将一个正在运行的程序称为进程.每个进程都有它自己的系统状态,包含内存状态 ...
- Python标准库介绍
1. 关于Python标准库 众所周知,Python是一个依赖强大的组件库完成对应功能的语言,为了便捷实现各项功能,前辈大牛们打造了多种多样的工具库公开提供给大众使用,而越来越多的库已经因为使用的广泛 ...
最新文章
- 在线作图|2分钟在线绘制RDA图
- mysql 游标 ,嵌套游标
- LINUX下文件字符集编码查看与转换并文件名编码转换
- Python实现遍历目录与子目录,并找到以.txt结尾的文件
- 计算机二级语义网络的研究现状与展望,计算机二级access选择题题库研究.doc
- 操作系统磁盘调度_磁盘调度| 操作系统
- linux 下查看程序依赖的库
- 第十四节: EF的三种模式(四) 之 原生正宗的 CodeFirst模式的默认约定
- 凉了!张三同学没答好「进程间通信」,被面试官挂了....
- 工作3、5年,选择大厂还是小厂?
- 腾讯研发总监王辉:十亿级视频播放技术优化揭秘
- unity ab包加载_Unity资源管理和打包
- 电脑重启 硬件问题引发的人品问题
- 计算机专业课系列之四:漫谈操作系统之虚拟内存
- MyEclipse的html页面 design视图中 关闭可视化界面
- 中国IP网通IP地址段
- VS2010的项目配置属性中文对照
- 获取字符串中 图片路径
- Ubuntu中安装VirtualBox
- 基于单片机的超市储物柜设计_基于51单片机的超市自动储物柜的设计,求大佬指点?...
热门文章
- Python使用正则表达式检查合法IP地址
- 微课|玩转Python轻松过二级:第1章课后习题解答
- 【C++】之【运算符重载函数】
- 关于流(文件)的输入,输出与调用(fprintf,fscanf)
- 35岁学python爬虫_35岁码农的机器学习入门之路-python篇
- 关于二叉树路径的遍历和处理
- android 保存图片出现2张_OriCell第三届细胞培养图片大赛来啦~ - 实验动物
- flowable 多人签收_业务流程 BPM、工作流引擎、Flowable、Activiti
- flink source 同步_Flink面试题
- mysql xa 实现_MySQL数据库分布式事务XA的实现原理分析