我正在使用Matlab 2009b并出现内存不足错误。我读了其他发布的sol但它们对我没用。我确信我正在做正确的事情,但我必须使用非常大量的数组大小。我认为问题超出了Matlab不允许数组在多个OS块中的事实。我正在使用 Windows 7 。有没有办法摆脱这个问题?例如,我可以增加Matlab在Windows 7中使用的数组块吗?
系统:Windows 7
Matlab:2009b
答案 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 memstats
和system_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,所以作为奖励,你的代码将更容易并行化。