我正在使用块处理方法来处理两个大矩阵之间的计算。
使用更大的块大小时代码显着加快。但如果我太大了,那我就会出现Out of Memory错误。目前,我手动调整代码以找到给定输入的最大工作块大小。
我的问题:如何自动找到最大块大小的过程?
我玩弄了一下try / catch块中的所有东西,并逐渐缩小块大小,直到成功为止。我希望有更优雅或惯用的方式。
答案 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.
如果您经常遇到内存不足的问题,可以采取以下措施: