Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
![]() |
#1 |
高级会员
注册日期: 2019-11-21
帖子: 3,006
声望力: 66 ![]() |
![]()
我正在使用块处理方法来处理两个大型矩阵之间的计算。
使用较大的块大小时,该代码可显着加快速度。但是,如果太大,则会收到“内存不足”错误。目前,我手动调整代码以找到给定输入的最大工作块大小。 我的问题 :如何自动查找可能的最大块大小? 我开玩笑地将所有内容包装在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. 如果您经常遇到内存不足的问题,可以执行以下几项操作: 更多&回答... |
![]() |
![]() |