nsa*_*ers 2 memory matlab matrix out-of-memory
我正在使用块处理方法来处理两个大矩阵之间的计算.
使用更大的块大小时,代码显着加快.但如果我太大了,那我就会出现Out of Memory错误.目前,我手动调整代码以找到给定输入的最大工作块大小.
我的问题:如何自动找到最大块大小的过程?
我玩弄了一下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
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)
如果您经常遇到内存不足的问题,可以执行以下几项操作: