使用零时出错内存不足

时间:2018-04-02 00:55:18

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

当我尝试跑步时

Adj = zeros(x*y);

我收到以下错误:

  

使用零错误

     

内存不足。键入HELP MEMORY以获取选项。

其中x*y=37901。我的PC存储空间占用

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 个答案:

答案 0 :(得分:1)

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

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

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

当你只有11.9千兆字节的可用内存时,Matlab告诉你不能分配大于4.7千兆字节的数组。作为一种解决方法,我建议你看一下Tall Arrays,这是一个围绕处理大数据流而量身定制的Matlab功能:

  

高数组用于处理由内存支持的内存数据   数据存储区。数据存储使您可以使用大型数据集   小块,单独适合内存,而不是加载   整个数据立即设置到内存中。高大的数组扩展了这一   使您可以使用common来处理内存不足的数据   功能

     

什么是高阵列?

     

由于数据不是一次性加载到内存中,因此高数组在第一维中可以任意大   (也就是说,它们可以有任意数量的行)。而不是写作   考虑到巨大数据大小的特殊代码,例如   与MapReduce等技术一样,高大的数组可以让你使用大型数据   数据集以直观的方式设置,类似于您的方式   使用内存中的MATLAB®阵列。许多核心运营商和功能   高数组的工作方式与内存数组的工作方式相同。   MATLAB一次处理小块数据,处理所有数据   数据分块和后台处理,这样很常见   表达式,例如A + B,适用于大数据集。

     

高阵列的好处

     

与内存数组不同,在您请求计算之前,高数组通常不会被评估   使用收集功能执行。这种延期评估   允许您快速处理大型数据集。当你最终   使用gather请求输出,MATLAB结合排队的计算   在可能的情况下,通过最少的通过次数   数据。通过数据的次数极大地影响了执行   时间,因此建议您仅在请求输出时   必要的。