6

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

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

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

4

4 回答 4

4

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

于 2012-10-03T17:34:24.127 回答
1

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

于 2012-10-03T17:42:33.800 回答
0

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

于 2012-10-03T17:38:46.357 回答
0

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

我只与 hazelcast 合作过 - 所以不能告诉你任何关于其他人的事情。

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

于 2012-10-03T20:38:01.437 回答