mlpack:内存不足错误

时间:2014-09-05 23:32:26

标签: c++ out-of-memory k-means mlpack

目前,我尝试从mlpack(一个可扩展的机器学习库)执行k-means聚类。

但是当我在命令行执行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 个答案:

答案 0 :(得分:1)

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

对于大多数情况来说,mlpack比其他工具(如MATLAB或R)更加保守,但听起来你的数据集足够大,以至于你的选择(缺少像Kerrek建议的更多RAM的系统)是有限的。

加速k-means的许多策略包括对输入数据集进行采样并在输入点的子集上运行k-means。因为k-means对初始质心非常敏感,所以这种采样策略通常用于选择初始质心。见Bradley和Fayyad,1998:ftp://www.ece.lsu.edu/pub/aravena/ee7000FDI/Presentations/Clustering-Pallavi/Ref4_k-means.pdf

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