运行Python压缩感知代码出现MemoryError无法pickle报错如何解决?
压缩感知代码多进程报错修复方案
错误本质
该报错是两层问题叠加导致:
- 子进程执行压缩感知大矩阵运算时首先触发了MemoryError(内存不足)
- Python多进程池回传子进程异常对象时,出现了已知的序列化(pickle)失败问题,掩盖了真实的内存不足根因
修复步骤
第一步:先解决核心内存不足问题
- 调低并行进程数:修改
sense_multiple函数中进程池初始化代码,从默认的CPU核心数改为更小的数值,例如将pool = Pool()改为pool = Pool(processes=2),优先用单进程processes=1测试能否正常运行 - 减小输入图片尺寸:压缩感知测量矩阵的内存占用和图片像素数平方成正比,先将输入图片缩小到200*200以内的小尺寸测试
- 降低参数规模:不要设置过大的测量数
ks,先从远小于图片像素数的小参数开始测试,减小生成的测量矩阵占用内存
第二步:修复多进程序列化异常问题
- 优先用串行逻辑测试:临时将
sense_multiple中的pool.map(_sense_thread, params)替换为串行循环,先排除多进程干扰确认逻辑正常:
# 替换原pool.map及后续进程池关闭逻辑 for param in params: _sense_thread(param)
- 必须使用多进程时,在子进程函数内加异常捕获,只返回字符串类型的错误信息,避免异常对象无法序列化:
def _sense_thread(params): try: # 原有函数执行逻辑 except Exception as e: return f"执行错误:{str(e)}"
第三步:适配Python3运行环境
原代码为Python2版本,在Python3.9环境运行需要做基础适配:
- 将所有
print xxx语句修改为print(xxx) - 将代码中所有
xrange替换为range - 升级numpy、scipy依赖到兼容Python3.9的版本,避免旧版本库抛出不可序列化的异常对象
内容的提问来源于stack exchange,提问作者Phat Tran
相关产品推荐
相关产品推荐

