![]() |
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.