【问题标题】:Maximum array size in MATLAB?MATLAB中的最大数组大小?
【发布时间】:2011-01-20 21:43:21
【问题描述】:

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

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

a=zeros(1000000,1000000)

但我收到了错误:

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

我有一种感觉,不预先分配这个矩阵会严重减慢代码的速度。

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

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

【问题讨论】:

  • 您一定想知道为什么您的代码需要这么大的矩阵?也许使用稀疏矩阵会更好?
  • 嗯...如果您想象一下,您分配了 1,000,000,000,000 个变量。如果你用它来表示比特,那将是一个太比特......这是巨大的。你可能代表一个 32 位整数,所以那是 ~32 太比特 ._。那......巨大......我真的怀疑你有 4000 GB 的内存。
  • 这不会回答您的问题,但它可能有助于重新构建问题。你有多少可用内存?如果这些是双精度的,它们每个占用 8 个字节。这需要 10^12 * 8B = 8TB。你会把它存放在哪里?如果可以假设您的矩阵是稀疏的(即主要包含 0),则可以使用 Matlab 的 sparse 命令生成稀疏矩阵。
  • 请注意,预分配稀疏矩阵几乎从来都不是一个好主意。你永远不应该增量地构建一个稀疏矩阵,一次添加一个元素。

标签: matlab memory-management


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我同意上述观点,只是想指出 MATLAB 在将矩阵传递给函数时使用了写入时复制机制,这意味着除非该函数更改输入,就好像它被传递一样参考。
    【解决方案3】:

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

    功能内存统计

    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 字节 / 8 = 25,889,280 双精度)

    【讨论】:

    • 此命令仍然有效,但与可能的最大数组大小不同,应使用m = memory; m.MaxPossibleArrayBytes 检查。尽管如此,错误“超出程序允许的最大变量大小”甚至与此限制无关。它与数组中 元素 数量的硬限制有关,不是内存可用性问题,而是实现限制。我已经详细解释了这两个概念here
    【解决方案4】:

    极限

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

    1. MATLAB 允许的最大数组大小(以元素数量计),与当前内存可用性无关。
    2. 单个数组可用的当前字节数 - (当前)最大可能的数组大小(以字节为单位)。

    第一个限制是导致“超出程序允许的最大变量大小”的原因,而不是第二个限制。但是,第二个也是您必须注意的实际限制!

    检查限制

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

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

    根据documentation for the computer command,返回:

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

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

    另一方面,您可以在任何给定时刻创建的最大实际数组大小可以通过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 之前已经修复,现在可以通过以下设置更改(但只能减少到系统内存的一小部分):

    您不能将其增加到超出系统限制。

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

    【讨论】:

    • 可以通过语法而不是 UI 设置内存百分比限制吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 2012-04-06
    • 1970-01-01
    相关资源
    最近更新 更多