在Java中处理不适合RAM的大型阵列
我正在开发一个文本分析程序,该程序将文档表示为一些预定义特征空间中的“特征计数”(例如,特定标记的出现)数组。经过一些处理后,这些数组存储在ArrayList中在Java中处理不适合RAM的大型阵列,java,serialization,mallet,large-data,Java,Serialization,Mallet,Large Data,我正在开发一个文本分析程序,该程序将文档表示为一些预定义特征空间中的“特征计数”(例如,特定标记的出现)数组。经过一些处理后,这些数组存储在ArrayList中 我正在一个64MB的数据集上测试这个程序,有50000条记录。该程序在处理小数据集时运行良好,但现在当我开始将数组加载到ArrayList对象(使用.add(double[])方法)时,它始终抛出“内存不足”的Java堆异常。根据我分配给堆栈的内存量,我将在ArrayList的第1000到3000次添加时得到这个异常,远远少于我的500
我正在一个64MB的数据集上测试这个程序,有50000条记录。该程序在处理小数据集时运行良好,但现在当我开始将数组加载到ArrayList对象(使用.add(double[])方法)时,它始终抛出“内存不足”的Java堆异常。根据我分配给堆栈的内存量,我将在ArrayList的第1000到3000次添加时得到这个异常,远远少于我的50000个条目。我很清楚,我无法将所有这些数据存储在RAM中并像往常一样对其进行操作 但是,我不确定什么样的数据结构最适合在只有部分数据可以加载到RAM中时访问整个数据集并对其执行计算 我认为将数据序列化到磁盘并将位置存储在RAM中的hashmap中会很有用。然而,我也看到了关于缓存和缓冲处理的讨论
我100%确信这是一个常见的CS问题,所以我确信有几种聪明的方法可以解决这个问题。任何提示都将不胜感激:-)您有很多选择:
- 将堆大小(-Xmx)增加到几GB
- 不要使用装箱集合,请使用fastutil-这将减少内存使用4倍李>
- 分批或按顺序处理数据-不要同时将整个数据集保存在内存中
- 使用适当的数据库。甚至还有像HSQL这样的进程内数据库,您的里程可能会有所不同
- 通过map reduce处理您的数据,可能是本地的,比如pig