Windows下Python mmap内存共享问题:避免写入磁盘
Windows下Python用mmap实现无磁盘跨脚本内存共享
嘿,我来帮你搞定这个问题!首先得指出你当前代码的核心问题:你现在的实现是基于磁盘文件的内存映射,数据最终还是会落到磁盘上,完全不符合你“不写入磁盘”的需求。另外用文本模式打开文件操作mmap也容易踩编码的坑,因为mmap本质是操作字节流的。
核心问题拆解
- 你用
open(json_path, "r+", encoding="utf8")打开了实际磁盘文件,这种映射是把磁盘文件加载到内存,修改后最终会同步回磁盘,达不到无磁盘共享的目的。 - 文本模式打开文件会引入编码转换,和mmap的字节流操作不兼容,容易出现数据乱码。
正确实现:命名匿名内存映射(Windows专属)
Windows下的mmap支持通过tagname参数创建命名内存映射,这种映射不关联任何实际磁盘文件,内存来自系统的页文件,完全不会写入磁盘,刚好满足你的需求。
写入脚本(writer.py)
负责把数据写入共享内存:
import mmap import json def write_to_shared_memory(data): # 把要共享的数据转成字节流 data_bytes = json.dumps(data).encode("utf-8") data_length = len(data_bytes) # 创建命名共享内存:-1表示不关联磁盘文件,tagname是共享标识(必须唯一) with mmap.mmap(-1, data_length, tagname="MyUniqueSharedMemory", access=mmap.ACCESS_WRITE) as mapped_mem: # 写入字节数据 written_bytes = mapped_mem.write(data_bytes) print(f"成功写入{written_bytes}字节到共享内存") # 暂停等待读取脚本访问,按回车后关闭共享内存 input("保持共享内存打开中,按回车关闭...") if __name__ == "__main__": # 测试数据 test_data = { "username": "test_user", "scores": {"math": 95, "english": 88}, "active": True } write_to_shared_memory(test_data)
读取脚本(reader.py)
负责从共享内存读取数据:
import mmap import json def read_from_shared_memory(): # 通过相同的tagname打开共享内存,0表示自动匹配内存大小 with mmap.mmap(-1, 0, tagname="MyUniqueSharedMemory", access=mmap.ACCESS_READ) as mapped_mem: # 读取全部字节数据 data_bytes = mapped_mem.read() # 转成原始数据格式 data = json.loads(data_bytes.decode("utf-8")) print("从共享内存读取到的数据:") print(data) if __name__ == "__main__": read_from_shared_memory()
关键注意事项
- tagname唯一性:这个标识是全局的,要确保它不会和系统中其他程序的共享内存名称冲突,建议用更独特的名称(比如加上你的项目前缀)。
- 运行顺序:必须先启动写入脚本,等它创建好共享内存并写入数据后,再启动读取脚本,否则读取脚本会找不到对应的共享内存。
- 资源释放:用
with语句可以自动关闭mmap对象,避免内存泄漏;如果不用with,一定要记得调用close()方法。 - 可变长度数据:如果你的数据长度不固定,可以先写入4字节的长度标识(用
struct模块打包),读取时先读长度再读对应字节数的数据,避免读取不全或冗余。
内容的提问来源于stack exchange,提问作者user707779
相关产品推荐
相关产品推荐

