【问题标题】:Reading/Writing/Storing extremely large sets of sequential data读取/写入/存储非常大的顺序数据集
【发布时间】:2011-01-21 15:18:01
【问题描述】:

我正在与 Java 中的大型顺序数据集进行交互。理想情况下,我正在寻找一个库,我可以在其中存储流数据(想想不可变对象的序列),然后在以后浏览保存的数据。数据最终应该存储在磁盘上,而不应该全部存储在内存中。数据将是数学系统的状态——因此主要是数字(双精度数,甚至 BigDecimals)以及一些字符串。

目前这是针对桌面应用程序,因此一次只能有一个用户,并且可能有几个并发连接(多个对象/状态流)。稍后我可能会考虑采用分布式方法并支持同一数据库后端上的多个客户端。

我一直在研究各种 NoSQL 库,但我不确定哪些适合我的需求。有什么想法吗?

【问题讨论】:

  • 这让我想到了(基于)java.nio 的库,但我对此知之甚少,无法提供答案。
  • 您能否提供有关数据外观的任何详细信息?这将有助于回答 sql/nosql 问题。然后我们可以从那里开始。
  • 在内存中拥有非常大的对象并将其持久化到数据库中是个好主意吗?您不应该将流数据保存到文件并仅保留重要部分,例如文件名。
  • 已更新问题以包含更多细节并阐明我的要求。
  • 用户如何查找数据?每个顺序集是否有唯一的 ID?集合中的每个项目是否有任何类型的 ID 或时间戳?

标签: java database nosql


【解决方案1】:

看看OrientDB:插入非常非常快。在我的笔记本上在 6 秒内插入 1,000,000 个条目。此外,Java 可以嵌入到您的进程中运行。

【讨论】:

  • 虽然我还没有测试过这个库(我很快就会),但它似乎可以满足我的需要。看起来它也有一个不错的 API 堆栈。
  • 我已经测试并使用了这个库,我喜欢它。不过,我还没有在关键任务应用程序中使用它......
【解决方案2】:

如果您有任何方法可以计算要访问的每个对象的偏移量,那么简单的java.nio.MappedByteBuffer(相当于 mmap)可能会完成这项工作。

【讨论】:

    【解决方案3】:

    如果您有 64 位 JVM,您可以将文件内存映射到内存中。这将为每个文件提供最多 2 GB 的窗口。

    当您有多个客户端时,您可以拥有一个服务器进程,该进程可以访问文件或数据库并将数据缓存/分发给客户端。

    【讨论】:

      【解决方案4】:

      只使用二进制文件?如果您的对象大小相等,则容易;您可以使用随机访问在文件中跳转。您的操作系统将使用其磁盘缓存免费为您提供缓存。有时人们将数据库和 SQL 接口用作golden hammer

      【讨论】:

      • 我最初计划在本地系统上使用二进制文件进行基本测试。最终,我相信一个经过验证的数据库/数据存储系统将是最好的。我还提到了 NoSQL,因为 SQL 不适合我的数据使用类型 (afaik)。
      【解决方案5】:

      你看过Berkeley DB Java Edition吗?它是为这种类型的用例而设计的。大型数据集、高写入吞吐量、可靠的持久性以及一组非常适合 Java 开发人员的 API。您可以使用 Base API (key/value pairs)Collections API 或类似 JPA 的 DPL (Direct Persistence Layer) API。

      有一个很好的Getting Started Guide,其中包含示例并解释了各种 API。

      有很多与您类似的用例。事实上,Terracotta 和 Coherence 都使用 Berkeley DB 来实现持久性。与 Heretix、Internet Archive 项目、Tibco 和许多其他公司和项目一样。原因是 BDB 提供了他们需要的性能、可靠性、可扩展性、灵活性和简单性。

      免责声明:我是 Berkeley DB 的产品经理之一,所以我自然有偏见。但是您的用例听起来完全符合 BDB 的设计目标。

      祝你的项目好运。如果有什么可以帮助的,请告诉我们。您可以在OTN Forums 上询问有关 Berkeley DB Java 版的问题,在那里您可以找到一个由活跃的 Java 应用程序开发人员组成的大型社区。

      问候,

      戴夫

      【讨论】:

        猜你喜欢
        • 2018-08-04
        • 2016-01-22
        • 1970-01-01
        • 2011-11-05
        • 1970-01-01
        • 2020-04-27
        • 2016-06-22
        • 2016-04-23
        • 1970-01-01
        相关资源
        最近更新 更多