我有一个关于MATLAB内存消耗的小问题。
我的建筑:
我处理一个大小为62x11969100(名为y)的双矩阵。
当我尝试以下几点时:
a = bsxfun(@minus,y,-1)或者简单的
a = minus(y, -1)我得到了内存中的错误(在这两种情况下)。
我刚刚计算了分配给矩阵的ram空间:
62 x 11969100 x8= 5.53 GB
我哪里错了?!
非常感谢!
发布于 2013-05-16 10:56:03
我在Win64上运行,内存为16‘m。
从新的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-16 10:13:59
memory在windows平台上的输出:
>> 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使用一些黑客(找到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 ),所以内存中至少需要有两个这样的巨大的东西。
我猜您遇到了所有变量可用的总内存空间的第二个限制。
发布于 2013-05-16 09:05:53
为了提高效率,对bsxfun进行矢量化。通常,向量化解决方案需要的不仅仅是最小的内存。
您可以尝试使用repmat,或者如果不使用简单的for循环。
一般来说,我相信for循环将需要最少的内存。
https://stackoverflow.com/questions/16583154
复制相似问题