You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:21:49