Matlab报错内存不足,实用解决方法汇总

跑大矩阵或者大数据,Matlab 突然弹 Out of Memory,直接挂了。碰到这种情况怎么办?本文整理实用解决办法,从简单到复杂挨个试。
先看你用了多少内存
先看现在内存占用多少,哪些变量占得多:
whos
列出来所有变量大小,一下子就看到哪个巨型变量占空间。不用的变量及时清:
clear big_variable
清掉不用的,立马腾出空间。
清完还能压缩一下内存碎片:
pack
把碎片合并,腾出连续空间给大矩阵用。
换数据类型节省空间
默认双精度占 8 字节一个元素,很多时候不用这么高精度,换单精度或者整数能省一半空间。
例子:
原来:
A = rand(10000, 10000); % 占 800MB
换单精度:
A = rand(10000, 10000, 'single'); % 只占 400MB,省一半
逻辑数组只用 1 字节,本来就是 0/1 别用双精度:
mask = false(10000, 10000); % 100MB,双精度要 800MB
整型存整数,根据范围选 uint8, uint16, uint32,比双精度省很多。
用稀疏矩阵
矩阵里很多零,用稀疏存储:
A_sparse = sparse(A);
稀疏矩阵只存非零元素,零不占空间,零多的话能省一两个数量级空间。比如网络图、邻接矩阵,大部分元素都是零,一定要用稀疏。
分块处理,不要一次加载全量数据
数据太大装不下,别一次读进来,分块读分块处理,处理完一块存结果,清掉内存再读下一块:
fin = fopen('big_data.bin', 'r');
while ~feof(fin)
block = fread(fin, block_size, 'double');
% 处理 block
result_block = process(block);
save_result(result_block);
clear block;
end
fclose(fin);
很多人图方便一次性读,大文件肯定爆内存。分块处理虽然麻烦一点,能跑起来总比报错强。
关了没用的 Figure 窗口
开几十个 Figure 不关,每个图都占内存,关了:
close all
内存立马降下来。尤其是存了很多数据在 Figure UserData 里,关了图就释放了。
增加虚拟内存
Windows 虚拟内存不够,开大点:
- 右键此电脑 → 属性 → 高级系统设置 → 性能 → 设置 → 高级 → 虚拟内存 → 更改
- 系统盘至少留比物理内存大二三倍空间,让系统自动管理也行
虚拟内存慢一点,但能让程序跑起来,比直接报错好。
换 64 位 Matlab
如果你还在用 32 位 Matlab,最多只能用 4GB 内存,肯定容易爆。一定要装 64 位版本,现在都是 64 位系统,完全支持,能用上好几十一百GB内存。
清理工作区
脚本开头加上:
clear all
close all
每次运行都是干净环境,不会被之前跑的大变量占着内存。很多人跑多次,不清理,内存累加着就爆了。
计算完及时释放
大矩阵用完立马清:
result = process_big(A);
clear A
不用了就放空间出来,后面计算就不容易爆。
用 tall 数组处理超大数据
Matlab 有 tall 数组,大数据太大装不下内存,它自动分块处理,不用你手动分:
ds = datastore('big_file.csv');
t = tall(ds);
result = sum(t.Var1);
gather(result);
底层自动分块,你写代码跟普通数组一样,方便很多,新版本推荐用这个。
总结试错顺序
- 清无用变量:
clear+pack - 换数据类型省空间,稀疏矩阵存稀疏数据
- 分块处理或者用 tall 数组,不一次性加载
- 关多余窗口,重启 Matlab
- 增加虚拟内存,确认用 64 位版本
一步步试,大部分情况都能解决。真的太大,那就要加物理内存了,物理内存够才是真的快。

浙公网安备 33010602011771号