处理Java中不适合RAM的大型数组

时间:2015-09-29 03:27:15

标签: java serialization mallet large-data

我正在开发一种文本分析程序,它将文档表示为某些预定义特征空间内的“特征计数”(例如,特定标记的出现)的数组。经过一些处理后,这些数组存储在ArrayList中。

我正在64 MB数据集上测试程序,有50,000条记录。该程序适用于小型数据集,但现在当我开始将数组加载到ArrayList对象(使用.add(double [])方法)时,它始终抛出“内存不足”的Java堆异常。根据我分配给堆栈的内存量,我将在ArrayList的第1000至第3000次添加此异常,远远低于我的50,000个条目。我清楚地知道,我无法将所有这些数据存储在RAM中并像往常一样对其进行操作。

但是,我不确定哪种数据结构最适合允许我访问和执行整个数据集的计算,只有部分数据结构可以加载到RAM中?

我在想将数据序列化到磁盘并将位置存储在RAM中的散列映射中会很有用。但是,我也看到了有关缓存和缓冲处理的讨论。

我100%肯定这是一个常见的CS问题,所以我确信有几种聪明的方法可以解决这个问题。任何指针将不胜感激: - )

2 个答案:

答案 0 :(得分:2)

你有很多选择:

  • 将堆大小(-Xmx)增加到几千兆字节。
  • 不要使用拳击收藏,使用fastutil - 这应该减少你的内存使用4倍。 http://fastutil.di.unimi.it/
  • 批量或按顺序处理数据 - 不要将整个数据集同时保存在内存中。
  • 使用适当的数据库。甚至还有像HSQL这样的进程内数据库,你的里程可能会有所不同。
  • 通过map-reduce处理您的数据,也许像猪一样本地化。

答案 1 :(得分:0)

如何使用Apache Spark(非常适合内存中的群集计算)?这有助于在数据集变大时扩展基础架构。