使用Java存储和检索大型数据集的最佳方法

时间:2012-10-03 16:54:03

标签: java dataset store

我目前正在开发Java项目,我必须在非常大的数据集上执行多项信息检索和分类任务。一个小集合将有10K文件。从每个文档大约100个150维向量的双打。因此,大约有150个双打或150个双打的1M矢量。存储后我需要回忆所有这些或它们的百分比并执行聚类(例如KMEANS)。实际的集合有更多的文档(我目前正在处理200K文档)。

当然我已经多次处理OutOfMemoryError了,我问题的最后一个解决方案是存储10个总大小> 5GB的巨大XML文件。文件必须是10,因为DOM Writer的内存已满。为了阅读,我使用SAX Parser完成了这项工作,而没有将它们加载到内存中。另外,将double存储到任何类型的文本中会使其实际大小倍增,并增加解析和转换的计算成本。最后,聚类算法通常是迭代的,因此它们将一次又一次地需要相同的数据。我的方法没有缓存任何东西,它只是从磁盘读取了很多次。

我现在正在寻找一种更紧凑的方式来存储二进制格式的任何数据量(数据库,原始二进制文件等)以及一种有效的读取方式。有人提出任何想法吗?

4 个答案:

答案 0 :(得分:4)

嵌入式数据库或键值存储。有很多,例如JDBM3。以xml格式存储多么奇怪的想法?您可以使用标准序列化技术将数组转储到文件中。

答案 1 :(得分:1)

我对你的情况不太确定,但是对于我们的“大数据处理”需求,我们使用了noSQL DB,它运行得很好。

答案 2 :(得分:0)

不要将Derby用于此目的。存储超过500k条目非常慢并且使用太多内存

答案 3 :(得分:0)

In-Memory Datagrids可以解决您的问题。有几种开源解决方案可用(Hazelcast,Infinispan)。

我只使用了hazelcast - 所以不能告诉你关于其他人的任何事情。

Hazelcast通过多个节点传播数据。查询也分布在集群中的所有节点上。