【问题标题】:Error using zeros Out of memory使用零时出错 内存不足
【发布时间】:2018-04-02 00:55:17
【问题描述】:

当我尝试跑步时

Adj = zeros(x*y);

我收到以下错误:

使用零时出错

内存不足。键入 HELP MEMORY 作为您的选项。

在哪里x*y=37901。我的PC存储占用率是

我知道 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)

【问题讨论】:

    标签: matlab memory memory-management out-of-memory


    【解决方案1】:

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

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

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

    当您只有11.9 千兆字节的可用内存并且Matlab 告诉您不能分配大于4.7 千兆字节的数组时。作为一种解决方法,我建议您查看Tall Arrays,这是针对处理非常大的数据流而定制的 Matlab 功能:

    Tall 数组用于处理由 一个数据存储。数据存储使您能够处理大型数据集 单独适合内存的小块,而不是加载 整个数据集一次进入内存。高大的阵列扩展了这个 使您能够使用常见的处理内存不足数据的能力 功能。

    什么是高阵列?

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

    高阵列的好处

    与内存中的数组不同,tall 数组通常保持未计算,直到您请求计算 使用gather函数执行。本次延期评估 允许您快速处理大型数据集。当你最终 使用gather请求输出,MATLAB将排队的计算结合起来 在可能的情况下,通过最少的次数 数据。通过数据的次数极大地影响执行 时间,因此建议您仅在以下情况下请求输出 必要的。

    【讨论】:

      猜你喜欢
      • 2012-05-15
      • 2016-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多