【问题标题】:MATLAB block size and memory managementMATLAB 块大小和内存管理
【发布时间】:2010-01-27 18:08:30
【问题描述】:

我正在使用块处理方法来处理两个大型矩阵之间的计算。

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

我的问题:我怎样才能使寻找最大可能块大小的过程自动化?

我曾尝试将所有内容包装在一个 try/catch 块中,并以逐渐减小的块大小进行循环,直到成功。我希望有一种更优雅或更惯用的方式。

【问题讨论】:

    标签: matlab memory matrix out-of-memory


    【解决方案1】:

    在进行块处理之前,您可以使用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 不再需要的变量(特别是如果它们很大)。

    【讨论】:

    • 由于最近的编辑增加了这个问题,我想在这个优秀的总结中添加:也使用profilermemory 选项。它允许查找某些函数必须分配多少额外内存才能在变量上运行。此undocumented 文章中memory 选项的详细信息。
    • 在 Matlab2014b 中:>> uV = memory uV = MaxPossibleArrayBytes: 59587694592 MemAvailableAllArrays: 59587694592 MemUsedMATLAB: 872325120 >> maxN = floor(sqrt(uV.MaxPossibleArrayBytes/8)) maxN = 86304 >> mat3 = ones(maxN); Out of memory. Type HELP MEMORY for your options. >> mat3 = ones(maxN-100); Out of memory. Type HELP MEMORY for your options. 你会知道这个方法是特定于版本还是系统?您是否可以指出我的修改?
    • @Aaron:请注意,MaxPossibleArrayBytes 等于 MemAvailableAllArrays,这意味着您只能分配 1 个该大小的矩阵(仅此而已)。但是,MemUsedMATLAB 显示大量内存已经被使用。先清除所有其他数据,或者试试这个:uV = memory; maxN = floor(sqrt((uV.MaxPossibleArrayBytes-uV.MemUsedMATLAB)/8));
    • >> uV = memory; >> maxN = floor(sqrt(uV.MaxPossibleArrayBytes/8)) maxN = 86160 >> mat3 = ones(maxN); Out of memory. Type HELP MEMORY for your options. 符合预期,但是,注意到 >> maxN = floor(sqrt((uV.MaxPossibleArrayBytes-uV.MemUsedMATLAB)/8)) maxN = 85610 如果我尝试使用 85610 和 86160 之间的值运行,MATLAB 不知道告诉我 Out of Memory 并且只会挂起并冻结计算机。 mat3 = ones(maxN); 使用更新的下界公式85610,在过去 2 小时内也将其冻结,直到我重新启动。最大块大小不可能吗?
    猜你喜欢
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    • 2014-03-30
    • 2011-06-14
    • 1970-01-01
    相关资源
    最近更新 更多