2010-04-30 71 views
4

我正在使用Matlab 2009b并出现内存不足错误。我读过其他贴子,但他们对我无用。我确信我正在做的事情,但我必须使用非常大量的数组大小。我认为这个问题超出了Matlab不能将数组放在多个OS块中的事实。我正在使用Windows 7。有没有办法摆脱这个问题?例如,我可以增加Matlab在Windows 7中使用的数组块吗?如何在Matlab 2009b中增加数组块并解决内存不足错误?

系统:Windows 7
Matlab的:2009年b

+0

不直接适用,但运行Win XP的用户可能会遇到此问题的解决方案由MathWorks在此处提供:http://www.mathworks.com/support/solutions/en/data/1-1HE4G5/index.html ?solution = 1-1HE4G5 – 2010-04-30 13:02:53

+0

矩阵的大小是多少? – Jacob 2010-04-30 15:26:35

+1

如果您可以提供更多详细信息,例如阵列的典型大小以及您正在执行的操作,我们将能够更好地帮助您找到解决方案。 – gnovice 2010-04-30 19:36:24

回答

3

如果最大的可用块(如图memory)比的最大内存量小得多提供给MATLAB,Matlab的重新启动(或系统)可以帮助。否则,您需要重写代码或购买更多内存(和/或使用64位版本的Win7)。

我建议你尝试重写你的代码。解决内存问题通常是可能的。

编辑

从上@Richie棉花的文章发表的留言,我看到你想要做分类的庞大的数据量。如果是少数类,其中没有一个非常稀疏,那么可以通过在每个数据的30%的数据上运行kmeans,比如10个随机选择的子集来解决问题。这应该找到你的集群的中心很好。要将数据与内核相关联,您只需计算每个数据点到聚类中心的距离,并将它们与最近的中心相关联即可。

3

如果您认为阵列大小不足以保证出现此类错误,则可能是您的之前的操作存在分散的可用内存。 MATLAB需要连续的块,因此碎片会导致这种错误。

因此,在出现内存不足错误的代码点之前,请尝试运行pack命令。除了通常的修复之外,我能想到的就是这些。

2

编辑:MathWorks give advice on this problem


可以查看存储器使用与命令system_dependent memstatssystem_dependent dumpmem(以及简单地memory,如由乔纳斯说明)。

命令pack(实际上会对工作区进行碎片整理)也可能有用。

如果您正在处理的对象包含超过1000万的值,那么内存很容易成为问题。抛出硬件问题(即购买更多内存)可能是一种选择,但是您可以实现的功能有限。

我建议你的方法重新编码的东西,使他们更高效的内存的方法是:

查看是否有你不需要分配任何变量。这是一个典型的例子,当一个函数返回一个与输入相同大小的值时。

function x = XPlus1(x) 
x = x + 1; 
end 

比更多的内存高效

function y = XPlus1(x) 
y = x + 1; 
end 

接下来,尝试上下分割你的问题分成小块。在最简单的层面上,这可能涉及对行进行操作而不是整个矩阵,或者对单个元素而不是矢量执行操作。 (由于内存限制,循环的成本低于它根本不运行的成本)。然后你必须从碎片中重建你的答案。

这一步基本上是behing map-reduce的哲学,因此作为奖励,您的代码将更容易并行化。

+0

我认为非这些解决方案是有效的。我想解决的一个问题是找到巨大矩阵的协方差矩阵。我也想为大数据数组使用k-means算法。在之前的两个问题中,我认为我不能使用任何建议的解决方案。非常感谢您的兴趣。 – Hani 2010-04-30 13:54:06

+0

@Hani:对于k-means,可能有一个简单的解决方案,可能需要更长的时间,但这将使您的大型阵列完成工作。看我的编辑。 – Jonas 2010-04-30 14:35:18