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

使用较大的块大小时,该代码可显着加快速度。但是,如果我太大,则会收到“内存不足”错误。目前,我手动调整代码以找到给定输入的最大工作块大小。

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

我开玩笑地将所有内容包装在try / catch块中,并以越来越小的块大小循环播放,直到成功为止。我希望有一种更优雅或更惯用的方式。

最佳答案

在执行块处理之前,可以使用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不再需要的变量(尤其是如果它们很大的话)。

关于matlab - MATLAB块大小和内存管理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2149241/

10-10 13:49