我正在使用Matlab 2009b并出现内存不足错误。我读过其他贴子,但他们对我无用。我确信我正在做的事情,但我必须使用非常大量的数组大小。我认为这个问题超出了Matlab不能将数组放在多个OS块中的事实。我正在使用Windows 7。有没有办法摆脱这个问题?例如,我可以增加Matlab在Windows 7中使用的数组块吗?如何在Matlab 2009b中增加数组块并解决内存不足错误?
系统:Windows 7
Matlab的:2009年b
我正在使用Matlab 2009b并出现内存不足错误。我读过其他贴子,但他们对我无用。我确信我正在做的事情,但我必须使用非常大量的数组大小。我认为这个问题超出了Matlab不能将数组放在多个OS块中的事实。我正在使用Windows 7。有没有办法摆脱这个问题?例如,我可以增加Matlab在Windows 7中使用的数组块吗?如何在Matlab 2009b中增加数组块并解决内存不足错误?
系统:Windows 7
Matlab的:2009年b
如果最大的可用块(如图memory
)比的最大内存量小得多提供给MATLAB,Matlab的重新启动(或系统)可以帮助。否则,您需要重写代码或购买更多内存(和/或使用64位版本的Win7)。
我建议你尝试重写你的代码。解决内存问题通常是可能的。
编辑
从上@Richie棉花的文章发表的留言,我看到你想要做分类的庞大的数据量。如果是少数类,其中没有一个非常稀疏,那么可以通过在每个数据的30%的数据上运行kmeans,比如10个随机选择的子集来解决问题。这应该找到你的集群的中心很好。要将数据与内核相关联,您只需计算每个数据点到聚类中心的距离,并将它们与最近的中心相关联即可。
如果您认为阵列大小不足以保证出现此类错误,则可能是您的之前的操作存在分散的可用内存。 MATLAB需要连续的块,因此碎片会导致这种错误。
因此,在出现内存不足错误的代码点之前,请尝试运行pack
命令。除了通常的修复之外,我能想到的就是这些。
编辑:MathWorks give advice on this problem。
可以查看存储器使用与命令system_dependent memstats
和system_dependent dumpmem
(以及简单地memory
,如由乔纳斯说明)。
命令pack
(实际上会对工作区进行碎片整理)也可能有用。
如果您正在处理的对象包含超过1000万的值,那么内存很容易成为问题。抛出硬件问题(即购买更多内存)可能是一种选择,但是您可以实现的功能有限。
我建议你的方法重新编码的东西,使他们更高效的内存的方法是:
查看是否有你不需要分配任何变量。这是一个典型的例子,当一个函数返回一个与输入相同大小的值时。
function x = XPlus1(x)
x = x + 1;
end
比更多的内存高效
function y = XPlus1(x)
y = x + 1;
end
接下来,尝试上下分割你的问题分成小块。在最简单的层面上,这可能涉及对行进行操作而不是整个矩阵,或者对单个元素而不是矢量执行操作。 (由于内存限制,循环的成本低于它根本不运行的成本)。然后你必须从碎片中重建你的答案。
这一步基本上是behing map-reduce的哲学,因此作为奖励,您的代码将更容易并行化。
不直接适用,但运行Win XP的用户可能会遇到此问题的解决方案由MathWorks在此处提供:http://www.mathworks.com/support/solutions/en/data/1-1HE4G5/index.html ?solution = 1-1HE4G5 – 2010-04-30 13:02:53
矩阵的大小是多少? – Jacob 2010-04-30 15:26:35
如果您可以提供更多详细信息,例如阵列的典型大小以及您正在执行的操作,我们将能够更好地帮助您找到解决方案。 – gnovice 2010-04-30 19:36:24