【问题标题】:Best way to store and retrieve large data sets with Java使用 Java 存储和检索大型数据集的最佳方式
【发布时间】:2012-09-24 15:48:17
【问题描述】:

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

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

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

【问题讨论】:

    标签: java dataset store


    【解决方案1】:

    内存数据网格可以解决您的问题。有几种可用的开源解决方案(Hazelcast,Infinispan)。

    我只用榛子播放 - 所以不能告诉你其他人。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我将使用大数据方法扩展这个答案。期待 hadoop 处理非常大的文件和 NoSQL 数据库(每个 @jakub.petr )来保存该数据
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2013-05-29
          • 1970-01-01
          • 2018-11-01
          • 2011-11-26
          • 1970-01-01
          • 1970-01-01
          • 2011-04-07
          • 1970-01-01
          • 2023-04-08
          相关资源
          最近更新 更多