我正在使用块处理方法来处理两个大型矩阵之间的计算。
使用较大的块大小时,该代码可显着加快速度。但是,如果我太大,则会收到“内存不足”错误。目前,我手动调整代码以找到给定输入的最大工作块大小。
我的问题:如何自动找到可能的最大块大小?
我开玩笑地将所有内容包装在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/