MATLAB爱好者论坛-LabFans.com

MATLAB爱好者论坛-LabFans.com (https://www.labfans.com/bbs/index.php)
-   资料存档 (https://www.labfans.com/bbs/forumdisplay.php?f=72)
-   -   MATLAB块大小和内存管理 (https://www.labfans.com/bbs/showthread.php?t=23084)

poster 2019-12-10 20:30

MATLAB块大小和内存管理
 
我正在使用块处理方法来处理两个大型矩阵之间的计算。

使用较大的块大小时,该代码可显着加快速度。但是,如果太大,则会收到“内存不足”错误。目前,我手动调整代码以找到给定输入的最大工作块大小。

[B]我的问题[/B] :如何自动查找可能的最大块大小?

我开玩笑地将所有内容包装在try / catch块中,并以越来越小的块大小循环播放,直到成功为止。我希望有一种更优雅或更惯用的方式。



[B]回答:[/B]

在进行块处理之前,您可以使用[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/memory.html"]MEMORY[/URL]函数来查看已经使用了多少内存,以及剩余的可用空间可用于创建块处理的任何其他变量。如果可以根据块大小估算块处理步骤所需的总内存量,则可以在可用内存用完之前弄清楚块大小可以达到多少。这可能说起来容易做起来难,因为我不知道您是如何进行块处理的。

这是一个简单的例子。首先,清除工作区并创建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. 如果您经常遇到内存不足的问题,可以执行以下几项操作:
[LIST][*]对于大型矩阵,请使用[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/single.html"]单[/URL]精度(或[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/int8.html"]整数类型[/URL] ),而不是默认的[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/double.html"]双[/URL]精度。[*]确保[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/clear.html"]清除[/URL]不再需要的变量(尤其是如果它们很大的话)。[/LIST]
[url=https://stackoverflow.com/questions/2149241]更多&回答...[/url]


所有时间均为北京时间。现在的时间是 04:59

Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.