代码之家  ›  专栏  ›  技术社区  ›  nsanders

matlab块大小和内存管理

  •  2
  • nsanders  · 技术社区  · 15 年前

    我使用块处理方法处理两个大型矩阵之间的计算。

    当使用较大的块大小时,代码会显著加快速度。但是如果我变大了,就会出现内存不足的错误。目前,我手动调整代码以找到给定输入的最大工作块大小。

    我的问题 :如何自动查找最大可能块大小的过程?

    我把所有的东西都包装在一个Try/Catch块中,并用逐渐变小的块大小循环直到成功。我希望有一种更优雅或更习惯的方式。

    1 回复  |  直到 10 年前
        1
  •  8
  •   gnovice    15 年前

    在进行块处理之前,可以使用 MEMORY 函数来查看块处理可能需要创建的其他变量已经使用了多少内存,还有多少可用内存。如果可以估计块处理步骤所需的总内存量(作为块大小的函数),则可以在耗尽可用内存之前计算出块大小的大小。这可能说起来容易做起来难,因为我不知道您是如何进行块处理的。

    下面是一个简单的例子。我将首先清除工作区并创建两个大型矩阵:

    >> clear all
    >> mat1 = zeros(8000);  %# An 8000-by-8000 matrix of doubles
    >> mat2 = zeros(8000);  %# Another 8000-by-8000 matrix of doubles
    

    现在,假设我知道我必须分配一个 N-by-N 双精度矩阵,需要 8*N*N 内存字节数(每倍8字节)。我可以做下面的事情来看看我能做多大 N :

    >> uV = memory  %# Get the memory statistics
    
    uV = 
    
        MaxPossibleArrayBytes: 314990592
        MemAvailableAllArrays: 643969024
                MemUsedMATLAB: 1.2628e+009
    
    >> maxN = floor(sqrt(uV.MaxPossibleArrayBytes/8))  %# Compute the maximum N
    
    maxN =
    
            6274
    
    >> mat3 = ones(maxN);    %# Works fine
    >> mat3 = ones(maxN+1);  %# Tanks! Too large!
    ??? Out of memory. Type HELP MEMORY for your options.
    

    如果您经常遇到内存不足的问题,可以做以下几件事: