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

Python shared_memory写入随机整数到共享内存块报错如何解决?

错误原因

报错ValueError: memoryview: invalid value for format 'B'的核心原因是:multiprocessing.shared_memory.SharedMemory实例的buf属性默认是格式为B(无符号单字节)的内存视图,仅支持写入**0255区间的整数**。你的代码生成的随机数范围是11000,大量数值超出单字节可承载的最大值255,赋值时直接触发类型校验错误。

正确写入方法

根据你实际要存储的数值范围,选对应方案即可:

方案1:存储0~255范围的整数(匹配10字节内存大小)

如果你不需要存大于255的数,直接把随机数生成范围调整到单字节合法区间即可,10字节刚好存10个数值:

from multiprocessing import shared_memory
import random

# 创建10字节共享内存块
shared_mem_1 = shared_memory.SharedMemory(create=True, size=10)
# 生成10个0~255区间的不重复随机数
num_list = random.sample(range(0, 256), 10)
# 逐字节写入
for idx, value in enumerate(num_list):
    shared_mem_1.buf[idx] = value

# 验证读取结果
print("写入结果:", [shared_mem_1.buf[i] for i in range(10)])

# 用完必须清理资源,避免共享内存泄漏
shared_mem_1.close()
shared_mem_1.unlink()

方案2:存储1~1000范围的整数

1000以内的整数至少需要2字节存储(2字节无符号整数支持范围0~65535,完全覆盖需求),此时需要调整申请的共享内存大小,借助标准库struct完成整数和字节的转换再写入:

from multiprocessing import shared_memory
import random
import struct

# 10个2字节整数共需20字节内存
shared_mem_1 = shared_memory.SharedMemory(create=True, size=2 * 10)
num_list = random.sample(range(1, 1000), 10)
# 将整数列表打包为2字节无符号短整型格式,直接写入共享内存
struct.pack_into(f'{len(num_list)}H', shared_mem_1.buf, 0, *num_list)

# 验证读取结果
read_result = list(struct.unpack_from(f'{len(num_list)}H', shared_mem_1.buf, 0))
print("写入的1~1000范围随机数:", read_result)

# 清理资源
shared_mem_1.close()
shared_mem_1.unlink()
注意事项
  • 共享内存不会随进程退出自动释放,用完必须先调用close()关闭当前进程对内存块的连接,再调用unlink()删除系统层面的共享内存段,否则会造成资源残留。
  • 写入的字节总长度不能超过申请的共享内存大小,否则会触发越界错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:24:24