Matlab:您对使用矩阵的小内存问题的看法

时间:2013-05-16 09:01:06

标签: matlab double ram bsxfun

我对MATLAB内存消耗有一个小问题。

我的建筑:

- Linux OpenSuse 12.3 64bit
- 16 GB的RAM
- Matlab 2013a 64位

我处理 double 矩阵,大小为:62 x 11969100(称为y)

当我尝试以下操作时:

a = bsxfun(@minus,y,-1)

或只是

a = minus(y, -1)

我收到了内存错误(在这两种情况下)。

我刚刚计算了为矩阵分配的ram空间:
62 x 11969100 x 8 = 5.53 GB

我哪里错了?!

非常感谢!

3 个答案:

答案 0 :(得分:1)

Windows平台上memory的输出:

>> memory
Maximum possible array:            2046 MB (2.145e+009 bytes) *
Memory available for all arrays:   3226 MB (3.382e+009 bytes) **
Memory used by MATLAB:              598 MB (6.272e+008 bytes)
Physical Memory (RAM):             3561 MB (3.734e+009 bytes)

*  Limited by contiguous virtual address space available.
** Limited by virtual address space available.

linux / mac上computer的输出:

>> [~,maxSize] = computer
maxSize =
     2.814749767106550e+14    % Max. number of elements in a single array

有一些黑客攻击(找到here):

>> java.lang.Runtime.getRuntime.maxMemory
ans =
    188416000  

>> java.lang.Runtime.getRuntime.totalMemory
ans =
    65011712

>> java.lang.Runtime.getRuntime.freeMemory
ans =
    57532968

如您所见,除了每个变量的内存限制外,所有变量的总存储空间也存在限制。对于Windows或Linux,这没有什么不同。

需要注意的重要一点是,例如在我的Windows机器上,即使我有足够的RAM,也不可能创建两个1.7GB的变量,并且它们都不受最大可变大小的限制。

由于执行minus操作会将相同大小的结果分配给新变量(a在您的情况下,或ans在未分配任何内容时),需要在记忆中至少两个这些巨大的东西。

我的猜测是你遇到了所有变量可用的总内存空间的第二个限制。

答案 1 :(得分:1)

我在Win64上运行,内存为16GB。

从一个新的MATLAB开始,只打开其他几个无关紧要的应用程序,我的基准内存使用量约为3.8GB。当我创建y时,它增加到9.3GB(9.3-3.8 = 5.5GB,大约是你计算的)。然后,当我运行a = minus(y, -1)时,我的内存不会耗尽,但它会上升到大约14.4GB。

你不需要花费太多额外的内存(最多1.6GB)就会造成内存不足的错误。

此外,当MATLAB存储数组时,它需要一个连续的内存块才能这样做。如果你的内存有点碎片 - 也许你有一些其他微小的变量碰巧存储在这些5.5GB块之一的中间 - 你也会得到一个内存不足的错误(你有时可以避免这个问题使用pack)。

答案 2 :(得分:0)

bsxfun的矢量化效率。通常,矢量化解决方案不仅需要最少的内存。

您可以尝试使用repmat,或者如果这不适用于简单的for循环。

一般来说,我认为for循环需要的内存最少。