MATLAB块大小和内存管理

时间:2010-01-27 18:08:30

标签: matlab memory matrix out-of-memory

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

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

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

我玩弄了一下try / catch块中的所有东西,并逐渐缩小块大小,直到成功为止。我希望有更优雅或惯用的方式。

1 个答案:

答案 0 :(得分: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

现在,让我说我知道我必须分配一个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.

如果您经常遇到内存不足的问题,可以采取以下措施:

  • 对大型矩阵使用single精度(或integer types),而不是默认的double精度。
  • 请确保您不再需要clear个变量(特别是如果它们很大)。