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

如何在Python中清空mmap字节数组?跨脚本共享内存重写

解决Python mmap共享内存重置写入位置的问题

首先要明确:Python的mmap对象并没有内置的clear()方法,你尝试的a[0:200] = []也会报错——因为切片赋值要求右侧是字节类对象,不能是列表。不过有几种简单的方式可以实现你要的「从索引0重新写入」的需求,甚至不需要完全清空缓冲区:


方法1:移动文件指针到起始位置(最常用)

mmap的写入操作是从当前文件指针位置开始的,所以你不需要清空整个区域,只需要把指针移回起始点,新写入的内容会自动覆盖旧数据:

import mmap
from time import sleep

# 建议把mmap创建放在循环外,避免重复创建映射带来的开销
with mmap.mmap(0, 200, 'GlobalSharedMemory') as a:
    while True:
        inp = bytes("Hello!", "utf-8")
        a.write(inp)
        sleep(0.01)
        
        # 把指针移到共享内存的起始位置
        a.seek(0)
        
        inp = bytes("How are you?", "utf-8")
        a.write(inp)
        sleep(0.01)

这个方法高效且直接,不需要额外的内存填充操作,适合大多数场景。


方法2:清空整个共享内存区域(彻底清除旧数据)

如果你确实需要把整个共享内存区域的内容都清空(比如旧数据长度比新数据长,不想留下残留字节),可以通过切片赋值用空字节填充整个区域,再移回指针:

import mmap
from time import sleep

with mmap.mmap(0, 200, 'GlobalSharedMemory') as a:
    while True:
        inp = bytes("Hello!", "utf-8")
        a.write(inp)
        sleep(0.01)
        
        # 用空字节填充整个200字节的共享内存区域
        a[:] = b'\x00' * 200
        # 移回起始位置准备写入
        a.seek(0)
        
        inp = bytes("How are you?", "utf-8")
        a.write(inp)
        sleep(0.01)

这样操作后,共享内存里所有字节都会被置为\x00,再写入新内容就不会有旧数据的残留了。


额外注意事项

  • 尽量避免在循环内重复创建mmap对象,每次创建映射都会有系统开销,放在循环外或者用with语句管理更高效。
  • 如果是多脚本并发读写,建议配合系统级别的同步机制(比如Windows上的msvcrt.locking),避免出现数据竞争问题。

内容的提问来源于stack exchange,提问作者mj1261829

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:24:34