本文最后更新于:2024年5月7日 下午
在程序运行过程中,可能遇到需要进程间或不同平台的语言之间进行信息交互,存在硬盘是一种解决方案但是速度太慢。python的mmap库提供了共享内存的实践方案可以完成信息在内存间交互。
简介
共享内存
内存共享是两个不同的进程共享内存的意思:同一块物理内存被映射到两个进程的各自的进程地址空间。这个物理内存已经被规定了大小(大小一定要比实际写入的东东大)以及名称。当需要写入时,找到内存名称,然后写入内存,等需要读取时候, 首先要知道你要读取多大(因为物理内存比你要读取的东东大,全部读取的话会读到一些“空”的东西),然后寻找对应名称的物理块,然后读取,就是这么简单。
mmap
mmap是一种虚拟内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。关于系统中mmap的理论说明可以看百度百科和维基百科说明以及mmap函数介绍,这里的说明是针对在Python下mmap块的使用说明。
使用方法
创建:创建并返回一个 mmap 对象
1 |
|
- fileno: 文件描述符,可以是file对象的fileno()方法,或者来自os.open(),在调用mmap()之前打开文件,不再需要文件时要关闭。
1 |
|
-
**length:**要映射文件部分的大小(以字节为单位),这个值为0,则映射整个文件,如果大小大于文件当前大小,则扩展这个文件。
-
flags:MAP_PRIVATE:这段内存映射只有本进程可用;mmap.MAP_SHARED:将内存映射和其他进程共享,所有映射了同一文件的进程,都能够看到其中一个所做的更改;
-
**prot:**mmap.PROT_READ, mmap.PROT_WRITE 和 mmap.PROT_WRITE | mmap.PROT_READ。最后一者的含义是同时可读可写。
-
**access:**在mmap中有可选参数access的值有:
1 |
|
对象方法
- m.close()
关闭 m 对应的文件;
- m.find(str, start=0)
从 start 下标开始,在 m 中从左往右寻找子串 str 最早出现的下标;
- m.flush([offset, n])
把 m 中从offset开始的n个字节刷到对应的文件中;
- m.move(dstoff, srcoff, n)
等于 m[dstoff:dstoff+n] = m[srcoff:srcoff+n],把从 srcoff 开始的 n 个字节复制到从 dstoff 开始的n个字节,可能会覆盖重叠的部分。
- m.read(n)
返回一个字符串,从 m 对应的文件中最多读取 n 个字节,将会把 m 对应文件的位置指针向后移动;
- m.read_byte()
返回一个1字节长的字符串,从 m 对应的文件中读1个字节,要是已经到了EOF还调用 read_byte(),则抛出异常 ValueError;
- m.readline()
返回一个字符串,从 m 对应文件的当前位置到下一个’\n’,当调用 readline() 时文件位于 EOF,则返回空字符串;
- m.resize(n)
把 m 的长度改为 n,m 的长度和 m 对应文件的长度是独立的;
- m.seek(pos, how=0)
同 file 对象的 seek 操作,改变 m 对应的文件的当前位置;
- m.size()
返回 m 对应文件的长度(不是 m 对象的长度len(m));
- m.tell()
返回 m 对应文件的当前位置;
- m.write(str)
把 str 写到 m 对应文件的当前位置,如果从 m 对应文件的当前位置到 m 结尾剩余的空间不足len(str),则抛出 ValueError;
- m.write_byte(byte)
把1个字节(对应一个字符)写到 m 对应文件的当前位置,实际上 m.write_byte(ch) 等于 m.write(ch)。如果 m 对应文件的当前位置在 m 的结尾,也就是 m 对应文件的当前位置到 m 结尾剩余的空间不足1个字节,write() 抛出异常ValueError,而 write_byte() 什么都不做。
使用示例
写入数据进共享内存
1 |
|
从共享内存中读取数据
1 |
|
代码运行不会顺畅,仅提供使用思路
参考资料
- https://docs.python.org/2/library/mmap.html
- https://zhuanlan.zhihu.com/p/166330573
- https://www.cnblogs.com/zhoujinyi/p/6062907.html
文章链接:
https://www.zywvvd.com/notes/coding/python/python-memory-share/python-memory-share/
“觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭”
微信支付
支付宝支付