Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中处理不适合RAM的大型阵列_Java_Serialization_Mallet_Large Data - Fatal编程技术网

在Java中处理不适合RAM的大型阵列

在Java中处理不适合RAM的大型阵列,java,serialization,mallet,large-data,Java,Serialization,Mallet,Large Data,我正在开发一个文本分析程序,该程序将文档表示为一些预定义特征空间中的“特征计数”(例如,特定标记的出现)数组。经过一些处理后,这些数组存储在ArrayList中 我正在一个64MB的数据集上测试这个程序,有50000条记录。该程序在处理小数据集时运行良好,但现在当我开始将数组加载到ArrayList对象(使用.add(double[])方法)时,它始终抛出“内存不足”的Java堆异常。根据我分配给堆栈的内存量,我将在ArrayList的第1000到3000次添加时得到这个异常,远远少于我的500

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


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

但是,我不确定什么样的数据结构最适合在只有部分数据可以加载到RAM中时访问整个数据集并对其执行计算

我认为将数据序列化到磁盘并将位置存储在RAM中的hashmap中会很有用。然而,我也看到了关于缓存和缓冲处理的讨论


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

您有很多选择:

  • 将堆大小(-Xmx)增加到几GB
  • 不要使用装箱集合,请使用fastutil-这将减少内存使用4倍
  • 分批或按顺序处理数据-不要同时将整个数据集保存在内存中
  • 使用适当的数据库。甚至还有像HSQL这样的进程内数据库,您的里程可能会有所不同
  • 通过map reduce处理您的数据,可能是本地的,比如pig

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

使用一个Database,该Database允许您查询一个小子集或执行一些其他分析(如运行函数或联接),并支持游标(因此不会将整个集合加载到内存中)或者其他一些内存/映射cache@MadProgrammer谢谢…内存映射IO文件呢?以前没有(直接)使用过内存映射文件,很难说。我最关心的问题是数据是否需要可序列化“我开始将数组加载到ArrayList对象中”您是要获取列表还是列表?如果是后者,稀疏数组将如何保存?你不是。@alamar不,我是说列表,所以我需要存储的元素越少越好。谢谢!我试着增加堆的大小…不起作用。我正在考虑使用稀疏阵列来减少存储,我将研究fastutil。第三个是我的下一个选择。我喜欢一个进程内的DB的想法……也会考虑。MapReduce可能有些杀伤力,但它也是一个选项。嗯……对于一个可能永远不会达到10 TB的数据集来说,这会是杀伤力过大吗?