用途:为 MATLAB 代码提供系统化的 7 步内存优化工作流,用于定位并修复内存瓶颈。适用于出现内存不足错误、想降低程序内存占用、希望处理更大数据集,或需要剖析与测量内存分配的场景。若瓶颈在执行速度而非内存、问题位于不可修改的 C/MEX 编译代码,或内存主要由 I/O 缓冲区占用,则不应使用本技能。
主要能力与步骤:
- 建立内存基线:用 memory 命令测量改动前内存,m0 = memory; targetFunction(inputs); m1 = memory; deltaBytes = m1.MemUsedMATLAB - m0.MemUsedMATLAB; 内存错误时在 Linux/macOS 可用 whos('result') 查看变量大小。
- 剖析内存分配:profile('-memory', 'on') 运行后 profile off,读取 FunctionTable 的 TotalMemAllocated 排序,关注高分配低释放、高频调用累积临时变量等。若该字段为零,回退为函数调用前后 whos 快照。
- 识别优化机会:参考内存模式,如循环内拼接造成的 O(N²) 增长、用隐式扩展替代 repmat、及时 clear 大数组、拆分链式表达式、变量复用、用 max/min 替代逻辑掩码、zeros(...,'like',x)、写时复制共享、稠密转稀疏等。
- 实施优化:仅针对热点应用上述模式。
- 测量优化后内存:用与第 1 步相同方式复测并计算降低比例。
- 验证正确性:对比原函数与优化函数结果,maxErr = max(abs(original(:) - optimized(:))); assert(maxErr < 1e-10, 'Results differ!');
- 报告结果:汇总基线、优化后、降低百分比、正确性检查与所用模式。
关键规则:不可仅凭阅读源码提出优化,必须先测量与剖析;内存优化必须保证结果一致;尽早清除不再需要的变量;避免数组增长,预分配或使用 cell 收集;拆分链式表达式降低峰值内存;注意写时复制带来的拷贝。
平台限制:Windows 上 memory 返回完整统计;Linux/macOS 上 memory 报“not supported on this platform”,需用 whos、Java Runtime.getRuntime 或系统 ps 查看 RSS。profile -memory 全平台可用,但自 R2016a 起为未公开特性;不可用时改用 whos 快照。