代码之家  ›  专栏  ›  技术社区  ›  csg techguy18985

内存中使用零时出错

  •  0
  • csg techguy18985  · 技术社区  · 6 年前

    当我试着跑步时

    Adj = zeros(x*y);
    

    我收到以下错误:

    使用零时出错

    内存不足。为您的选项键入帮助记忆。

    哪里 x*y=37901 。我的电脑存储空间占用率为

    enter image description here

    我知道C驱动器没有太多空间,但34.2 GB应该足以创建 37901*37901 矩阵

    当我运行 memory 命令这是我得到的:

    >> memory
    Maximum possible array:        4825 MB (5.059e+09 bytes) *
    Memory available for all arrays:        4825 MB (5.059e+09 bytes) *
    Memory used by MATLAB:       12369 MB (1.297e+10 bytes)
    Physical Memory (RAM):       12218 MB (1.281e+10 bytes)
    
    *  Limited by System Memory (physical + swap file) available.
    

    我如何解决这个问题?(我正在使用MATLAB 2017b)

    1 回复  |  直到 4 年前
        1
  •  1
  •   Tommaso Belluzzo    6 年前

    实际上,在编码方面,变量通常存储在内存中(您的计算机 RAM )而不是进入硬盘空间。这就是你的错误所抱怨的。。。内存不足,无法存储要分配的变量。

    Matlab使用的默认数值变量为 double ,用于表示双精度浮点值,并占用 8 字节的内存。因此,您试图分配:

    37901 * 37901 * 8  = 11491886408 bytes
                      ~= 10.7 gigabytes
    

    当你只有 11.9 GB的可用内存,Matlab告诉您不能分配大于 4.7 千兆字节。作为解决方法,我建议您 Tall Arrays ,这是针对处理超大数据流而定制的Matlab功能:

    高数组用于处理由支持的内存不足数据 数据存储。数据存储使您能够在中使用大型数据集 单独放入内存的小块,而不是加载 一次将整个数据集存储到内存中。高阵列扩展了这一点 使您能够使用公共 功能。

    什么是高阵列?

    由于数据不是一次性加载到内存中的,所以高数组在第一维中可以任意大 (也就是说,它们可以有任意数量的行)。而不是写作 考虑到巨大数据量的特殊代码,例如 与MapReduce等技术一样,高数组允许您处理大型 数据集的直观方式与 使用内存中的MATLAB阵列。许多核心操作符和函数 对高阵列的处理方式与对内存阵列的处理方式相同。 MATLAB一次处理小块数据,处理所有 在后台进行数据分块和处理,以便 表达式(如A+B)可用于大数据集。

    高阵列的好处

    与内存中的数组不同,在您请求计算 使用“聚集”功能执行。此延迟评估 允许您快速处理大型数据集。当你最终 使用gather请求输出,MATLAB结合排队计算 在可能的情况下,通过 数据通过数据的次数会极大地影响执行 时间,因此建议您仅在以下情况下请求输出 必需的