我对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
我哪里错了?!
非常感谢!
答案 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
循环需要的内存最少。