Matlab Horzcat - 内存不足

时间:2017-04-26 10:23:01

标签: matlab memory

在matlab中避免内存不足的任何技巧? 我假设它出现的原因是因为matlab在使用horzcat时非常低效,实际上需要临时复制矩阵。

我有一个大小为A的矩阵108977555 x 25。我想将其与三个向量dmy合并,每个向量的大小为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.

要做这个合并的任何技巧吗?

3 个答案:

答案 0 :(得分:5)

  

使用大型数据集。如果您正在处理大型数据集,则在增加数组大小时需要小心,以避免因内存不足而导致错误。如果将数组扩展到其原始位置的可用连续内存之外,MATLAB必须复制该数组并将此副本设置为新值。在此操作期间,内存中有两个原始数组副本。

  1. 重新启动matlab,我经常发现它没有完全清理它的内存,或者它会碎片化,导致最大阵列数量减少。

  2. 更改数据类型(如果可以)。例如。如果您只处理数字0 - 255,请使用uint8,与double s数组相比,内存大小 将减少8倍

  3. 开始时A已足够大(即108977555x27而不是108977555x25并插入到位:

    A(:, 4) = d;
    clear d
    A(:, 5) = m;
    clear m
    A(:, 6) = y;
    
  4. 将数据合并为一种数据类型以减少总内存需求,例如日期很容易适合一个uint32

  5. 将数据分开,首先想一想为什么要将数据放在一个矩阵中,以及是否真的有必要。

  6. 使用C-code自行进行数据分配(仅当您真的绝望时)

  7. 进一步阅读: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

  • 如果您的代码可以使用,则使用单个(4个字节)或其他一些较小的数据类型而不是Double(8个字节)。
  • 如果可能的话,使用块处理(如行或列),即将块存储为单独的mat文件,并仅加载和访问所需的矩阵部分。
  • 使用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和其他相关的大数据概念,这些概念恰好适用于如此大的数据集。

https://www.mathworks.com/help/matlab/tall-arrays.html