在matlab中避免内存不足的任何技巧? 我假设它出现的原因是因为matlab在使用horzcat时非常低效,实际上需要临时复制矩阵。
我有一个大小为A
的矩阵108977555 x 25
。我想将其与三个向量d
,m
和y
合并,每个向量的大小为108977555 x 1
。
我的机器有32GB内存,上面的matrice +矢量占用18GB。
现在我想运行以下命令:
A = [A(:,1:3), d, m, y, A(:,5:end)];
但是这会产生错误:
Error using horzcat
Out of memory. Type HELP MEMORY for your options.
要做这个合并的任何技巧吗?
答案 0 :(得分:5)
使用大型数据集。如果您正在处理大型数据集,则在增加数组大小时需要小心,以避免因内存不足而导致错误。如果将数组扩展到其原始位置的可用连续内存之外,MATLAB必须复制该数组并将此副本设置为新值。在此操作期间,内存中有两个原始数组副本。
重新启动matlab,我经常发现它没有完全清理它的内存,或者它会碎片化,导致最大阵列数量减少。
更改数据类型(如果可以)。例如。如果您只处理数字0 - 255
,请使用uint8
,与double
s数组相比,内存大小 将减少8倍
开始时A
已足够大(即108977555x27
而不是108977555x25
并插入到位:
A(:, 4) = d;
clear d
A(:, 5) = m;
clear m
A(:, 6) = y;
将数据合并为一种数据类型以减少总内存需求,例如日期很容易适合一个uint32
。
将数据分开,首先想一想为什么要将数据放在一个矩阵中,以及是否真的有必要。
使用C-code自行进行数据分配(仅当您真的绝望时)
进一步阅读:https://nl.mathworks.com/help/matlab/matlab_prog/memory-allocation.html
答案 1 :(得分:1)
您可以先尝试官方数学网站上提到的高效内存管理策略:https://in.mathworks.com/help/matlab/matlab_prog/strategies-for-efficient-use-of-memory.html
使用matfile
命令加载大型variables in parts。也许是这样的:
save('A.mat','A','-v7.3')
oldMat = matfile('A.mat');
clear A
newMat = matfile('Anew.mat','Writeable',true) %Empty matfile
for i=1:27
if (i<4), newMat.A(:,i) = oldMat.A(:,i); end
if (i==4), newMat.A(:,i) = d; end
if (i==5), newMat.A(:,i) = m; end
if (i==6), newMat.A(:,i) = y; end
if (i>6), newMat.A(:,i) = oldMat.A(:,i-2); end
end
答案 2 :(得分:1)
即使你可以使用Gunther的建议,也只会占用记忆。现在它需要超过一半的可用内存。那么,你打算做什么呢?即使是简单的B = A+1
也不合适。你唯一能做的就是sum
之类的东西,或者是数组部分的操作。
因此,您应该考虑转到tall arrays
和其他相关的大数据概念,这些概念恰好适用于如此大的数据集。