MATLAB中的最大数组大小?

时间:2010-02-25 07:45:43

标签: matlab memory-management

我正在编写一个MATLAB程序,它将生成一个包含100万行和未知列数(最多100万)的矩阵。

我尝试预先分配这个矩阵:

a=zeros(1000000,1000000)

但我收到了错误:

  

“超出了程序允许的最大变量大小。”

我觉得不预先分配这个矩阵会严重降低代码的速度。

这让我很好奇:MATLAB中的最大数组大小是多少?

更新:我将研究稀疏矩阵,因为我在这个特定问题中的目标是一个由大部分零组成的矩阵。

4 个答案:

答案 0 :(得分:8)

看一下这个页面,它列出了最大尺寸:Max sizes

看起来大约有几亿。请注意,您在此处尝试创建的矩阵是:10e6 * 10e6 = 10e12个元素。这比提供的最大尺寸大许多个数量级,并且您的系统上也没有那么多RAM。

我的建议是针对您要完成的任务来研究不同的算法。

答案 1 :(得分:6)

要查找实际最大数组大小(仅限Windows),请使用命令user = memory。 user.maxPossibleArrayBytes显示连续RAM的空闲字节数。除以数组中每个元素的字节数(双精度数为8),您就知道可以预分配的最大元素数。

请注意,正如woodchips所述,Matlab可能必须复制您的数组(例如,如果您将值传递给子函数)。根据我的经验,75%的最大可能阵列通常可以多次使用。

答案 2 :(得分:2)

限制

有两个不同的限制需要注意:

  1. MATLAB允许的最大阵列大小(以元素数量表示),与当前内存可用性无关。
  2. 单个阵列可用的当前字节数 - (当前)最大可能的数组大小(以字节为单位)。
  3. 第一个限制是导致程序允许的最大变量大小" ,而不是第二个限制。然而,第二个也是你必须意识到的实际限制!

    检查限制

    检查数组允许的最大元素数,如下所示:

    >> [~,maxsize] = computer
    maxsize =
       2.8147e+14
    

    根据documentation for the computer command,返回:

      

    此版本MATLAB中矩阵中允许的最大元素数

    这是元素数量的静态MATLAB限制,不受计算机状态(硬件规格和当前内存使用情况)的影响。对于那个长度的double数组,超过2 petabytes ,它也比我所知道的任何计算机都要高!

    另一方面,memory命令可以检查您在任何给定时刻可以创建的最大实际数组大小:

    >> memory
    Maximum possible array:     35237 MB (3.695e+10 bytes) *
    Memory available for all arrays:     35237 MB (3.695e+10 bytes) *
    Memory used by MATLAB:      9545 MB (1.001e+10 bytes)
    Physical Memory (RAM):     24574 MB (2.577e+10 bytes)
    
    *  Limited by System Memory (physical + swap file) available.
    

    正如消息所述,这些值基于实际当前内存可用性,同时考虑了物理内存和交换文件(统称为虚拟内存)。

    如果需要,可以m = memory;以编程方式访问这些值。

    调整限制

    第一个限制(硬限制)已经修复到R2015a,现在可以通过以下设置更改(但只减少到系统内存的一小部分):

    enter image description here

    您无法将其增加到超出系统限制范围。

    第二个限制显然没有"设置"在MATLAB中,因为它基于可用的内存和计算机配置。除了添加RAM之外,你可以做的事情并不多:(1)pack来整合工作区内存并执行"垃圾收集",但这可能只对某些平台有帮助, (2)增加页面文件大小以允许其他东西换出并为MATLAB提供更多的物理内存。但是在依赖您的页面文件时要小心,因为如果发生page file thrashing,您的计算机可能会无响应。

答案 3 :(得分:0)

在不包含memory命令的旧版Matlab中,您可以使用:

  
    

功能memstats

  
Physical Memory (RAM):
    In Use:                              738 MB (2e2c3000)
    Free:                                273 MB (11102000)
    Total:                              1011 MB (3f3c5000)
Page File (Swap space):
    In Use:                             1321 MB (529a4000)
    Free:                               1105 MB (45169000)
    Total:                              2427 MB (97b0d000)
Virtual Memory (Address Space):
    In Use:                              887 MB (37723000)
    Free:                               1160 MB (488bd000)
    Total:                              2047 MB (7ffe0000)
Largest Contiguous Free Blocks:
     1. [at 4986b000]                    197 MB ( c585000)
     2. [at 3e1b9000]                    178 MB ( b2a7000)
     3. [at 1f5a0000]                    104 MB ( 6800000)
     4. [at 56032000]                     77 MB ( 4d3e000)
     5. [at 68b40000]                     70 MB ( 4660000)
     6. [at 3a320000]                     54 MB ( 3610000)
     7. [at 63568000]                     45 MB ( 2d48000)
     8. [at 35aff000]                     40 MB ( 2821000)
     9. [at 60f86000]                     37 MB ( 25ca000)
    10. [at 6f49d000]                     37 MB ( 25b3000)
                                        ======= ==========
                                         842 MB (34ac0000)

ans =

   207114240

你无法抑制输出,但它会返回可用的最大内存块(207,114,240 Bytes / 8 = 25,889,280 double)