2014-09-05 153 views
1

目前我尝试从mlpack(一个可伸缩的机器学习库)执行k-means聚类。mlpack:内存不足错误

但是当我在命令行执行bin/kmeans时,我总是收到错误。

error: arma::memory::acquire(): out of memory 

terminate called after throwing an instance of 'std::bad_alloc' 
    what(): std::bad_alloc 

输入文件的大小是7.4 GB。

你有什么建议吗?你知道可以适用于大数据集的替代工具吗?

+1

掏出一些额外的RAM的现金? – 2014-09-05 23:33:24

+0

那么,“内存不足”的信息意味着你已经失去了内存,这对于这样的输入来说并不奇怪。为了完成你的工作,你必须改变算法,例如你可以将数据加载到内存中。 – grzkv 2014-09-11 16:02:35

回答

1

这里确实没有一个简单的解决方案。问题是Armadillo(底层矩阵库)无法为输入数据分配足够的空间。

对于绝大多数情况下,mlpack比其他工具(如MATLAB或R)更保守,但听起来您的数据集足够大,您的选项(缺少像Kerrek提供的具有更多内存的系统)是有限的。

许多用于加速k均值的策略涉及对输入数据集进行采样并在输入点的子集上运行k均值。由于k-means对初始质心非常敏感,因此该采样策略通常用于选择初始质心。请参阅Bradley和Fayyad,1998:ftp://www.ece.lsu.edu/pub/aravena/ee7000FDI/Presentations/Clustering-Pallavi/Ref4_k-means.pdf

对于您的情况,也许只需在可以加载到RAM中的数据的子集上运行k-means并将它们作为群集质心,就可以更容易和足够准确。如果k相当小并且数据集中的点数很大(即,簇的数量远小于点的数量),那么这应该是一种合理的方法,并且肯定比修改mlpack代码更加保守,可以使用RAM或编写自己的程序来使用mmap()或其他东西,而且比购买新RAM更便宜。