2012-10-03 41 views
6

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

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

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

回答

4

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

+1

JDBM3已经升级到JDBM4,更好地了解为[创建mapdb(http://www.mapdb.org/)。 –

0

不要为此使用Derby。 500K以上的条目存储是非常缓慢的,并使用了太多的内存

1

我不是很确定你的情况,但对于我们的“大数据处理”的需要,我们使用的NoSQL数据库和它的工作相当精细。

+0

我将扩展这个答案与一般的大数据的方法。看Hadoop的处理非常大的文件和NoSQL数据库(每@ jakub.petr)来保存数据 –

0

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

我只用hazelcast工作尚未 - 所以不能告诉你别人任何东西。

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

相关问题