MATLAB块大小和内存管理

nsa*_*ers 2 memory matlab matrix out-of-memory

我正在使用块处理方法来处理两个大矩阵之间的计算.

使用更大的块大小时,代码显着加快.但如果我太大了,那我就会出现Out of Memory错误.目前,我手动调整代码以找到给定输入的最大工作块大小.

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

我玩弄了一下try/catch块中的所有内容,并逐渐减小块大小的循环,直到成功为止.我希望有更优雅或惯用的方式.

gno*_*ice 8

在进行块处理之前,您可以使用MEMORY函数查看已经使用了多少内存,以及块处理可能需要创建的任何其他变量可用的内存量.如果您可以根据块大小估计块处理步骤所需的内存总量,则可以在耗尽可用内存之前确定块大小的大小.这可能说起来容易做起来难,因为我不确切知道你是如何进行块处理的.

这是一个简单的例子.我将首先清除工作区并创建2个大型矩阵:

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

现在,假设我知道我必须分配一个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.
Run Code Online (Sandbox Code Playgroud)

如果您经常遇到内存不足的问题,可以执行以下几项操作:

  • 对大型矩阵使用精度(或整数类型)而不是默认的精度.
  • 一定要清除不再需要的变量(特别是如果它们很大).