我正在使用块处理方法来处理两个大型矩阵之间的计算。
使用较大的块大小时,该代码可显着加快速度。但是,如果太大,则会收到“内存不足”错误。目前,我手动调整代码以找到给定输入的最大工作块大小。
我的问题 :如何自动查找可能的最大块大小?
我开玩笑地将所有内容包装在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. 如果您经常遇到内存不足的问题,可以执行以下几项操作:
- 对于大型矩阵,请使用单精度(或整数类型 ),而不是默认的双精度。
- 确保清除不再需要的变量(尤其是如果它们很大的话)。
更多&回答...