2

我有一个关于 MATLAB 内存消耗的小问题。

我的架构:

- Linux OpenSuse 12.3 64 位
- 16 GB 内存
- Matlab 2013a 64 位

我处理一个大小为:62 x 11969100(称为 y)的双精度矩阵

当我尝试以下操作时:

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

或者干脆

a = minus(y, -1)

我收到了OUT of MEMORY 错误(在这两种情况下)。

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

我哪里错了?!

非常感谢!

4

3 回答 3

1

memorywindows平台上的输出:

>> 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.

computer在 linux/mac 上的输出:

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

有一些技巧(在这里找到):

>> 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在不分配任何内容时),因此内存中至少需要有两个这些巨大的东西。

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

于 2013-05-16T10:13:59.107 回答
1

我在 Win64 上运行,具有 16GB RAM。

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

您不需要太多额外的内存(最多 1.6GB)就可以导致内存不足错误。

此外,当 MATLAB 存储数组时,它需要一个连续的内存块来执行此操作。如果你的内存有点零碎——也许你有几个其他的小变量恰好存储在其中一个 5.5GB 块的中间——你也会得到一个内存不足的错误(你有时可以避免这个问题使用pack)。

于 2013-05-16T10:56:03.963 回答
0

bsxfun 被矢量化以提高效率。通常矢量化解决方案需要的不仅仅是最少的内存。

您可以尝试使用repmat,或者如果这不起作用一个简单的for循环。

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

于 2013-05-16T09:05:53.147 回答