如何在Matlab 2009b中增加阵列块并解决内存不足错误?

时间:2010-04-30 09:37:26

标签: windows matlab out-of-memory

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

系统:Windows 7
Matlab:2009b

3 个答案:

答案 0 :(得分:3)

如果最大可用块(如memory所示)远小于Matlab可用的最大内存量,则重启Matlab(或系统)可能有所帮助。

否则,您需要重写代码或购买更多内存(和/或使用64位版本的Win7)。

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

修改

根据您对@Richie Cotton的帖子的评论,我发现您希望对大量数据进行分类。如果是少数几个类,其中没有一个是非常稀疏的,你可以通过运行kmeans来解决问题,例如10个随机选择的子集,比如每个数据的30%。这应该可以找到群集的中心。要将数据与内核相关联,您所要做的就是为每个数据点计算到集群中心的距离,并将它们与最近的中心相关联。

答案 1 :(得分:3)

如果您认为阵列大小不足以保证此类错误,那么您的之前的操作可能会使可用内存碎片化。 MATLAB需要连续的块,因此碎片可能导致此类错误。

因此,在代码中发生内存不足错误的点之前,请尝试运行pack命令。除了通常的解决方案之外,这就是我能想到的全部内容。

答案 2 :(得分:2)

编辑:MathWorks give advice on this problem


您可以使用命令system_dependent memstatssystem_dependent dumpmem(以及memory来查看内存使用情况,如Jonas所述)。

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

如果您正在处理包含>的对象1000万左右的值,然后内存很容易成为一个问题。在问题上投掷硬件(即购买更多RAM)可能是一种选择,但是你可以实现的目标是有限的。

我建议你采用重新编码方式以提高内存效率的方式是:

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

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

更有效
function y = XPlus1(x)
y = x + 1;
end

接下来,尝试将问题分解为小块。在最简单的级别,这可能涉及对行而不是整个矩阵执行操作,或者对单个元素而不是向量执行操作。 (由于记忆限制,循环的成本低于它根本没有运行的成本。)然后你必须从碎片重建你的答案。

这一步本质上是哲学behing map-reduce,所以作为奖励,你的代码将更容易并行化。