【问题标题】:Replacing a huge dump file with an efficient lookup Java key-value text store用高效的查找 Java 键值文本存储替换巨大的转储文件
【发布时间】:2012-12-06 11:18:21
【问题描述】:

我有一个巨大的转储文件 - 12GB 的文本包含数百万个条目。每个条目都有一个数字 id、一些文本和其他不相关的属性。我想将此文件转换为可提供有效查找的文件。也就是说,给定一个 id,它会快速返回文本。局限性:

  1. 嵌入在 Java 中,最好没有外部服务器或外语依赖项。
  2. 读写磁盘,而不是内存 - 我没有 12GB 的 RAM。
  3. 不会爆炸太多 - 我不想将 12GB 文件变成 200GB 索引。我不需要全文搜索、排序或任何花哨的东西 - 只需键值查找。
  4. 高效 - 数据量很大,而我只有一台机器,所以速度是个问题。可以存储大批量和/或与多个线程一起工作的工具是首选。
  5. 存储多个字段很好,但不是必须的。主要关心的是文本。

欢迎您的建议!

【问题讨论】:

  • 您应该指定转储的格式。
  • 格式重要吗?听起来它需要加载到某个商店中,因此初始格式与此问题无关
  • @BrianAgnew 我在想如果每条记录一行,他可以创建一个手动索引id=>lineNumber
  • @RC 一些普通的 XML,其中每个条目都是一个标记。然而,一个功能齐全的 XML DB 将是一个矫枉过正,因为它没有任何层次结构。可能是 CSV,问题仍然存在。
  • @RC 使用行号而不是给定的 id 是一个有趣的想法:Java 从 12GB 大小的文件中提取一行的速度有多快?不过,我不确定我是否可以单独使用这个技巧,因为有一些交叉引用。

标签: java large-files key-value-store


【解决方案1】:

我会使用 Java Chronicle 或类似的东西(部分是因为我写的),因为它被设计为随机访问大量数据(比你的机器大)。

它可以存储任意数量的文本或二进制格式的字段(如果您愿意,也可以组合) 它为您希望能够随机访问的每条记录添加 8 个字节。不支持删除记录(可以标记重复使用),但可以更新和添加新记录。

它只能有一个写线程,但可以被同一台机器上的多个线程读取(甚至是不同的进程)

它不支持批处理,但它可以每秒读取/写入数百万个条目,典型的亚微秒延迟(除了不在内存中的随机读取/写入)

它几乎不使用堆(

它使用一个连续的 id,但您可以构建一个表来进行翻译。

顺便说一句:您可以花不到 200 美元购买 32 GB。也许是时候获得更多内存了;)

【讨论】:

  • 是在内存中记录还是缓存到磁盘?
  • 它使用内存映射文件,因此操作系统的磁盘缓存可以直接在 Java 中访问。这意味着读写磁盘是由操作系统透明地完成的。即内存中有多少以及磁盘上有多少确实很重要(实际上无法从 Java 中分辨出来),并且取决于您拥有多少可用资源。顺便说一句,它需要一个 64 位 JVM 才能使用,因为它使用虚拟内存。
【解决方案2】:

为什么不使用JavaDb - Java 自带的数据库?

它会将信息存储在磁盘上,并且在查找方面非常高效,前提是您正确索引。它将在 JVM 中运行,因此您不需要单独的服务器/服务。您使用标准 JDBC 与它对话。

我怀疑它会非常有效。这个数据库历史悠久(它曾经是 IBM 的 Derby),并且在健壮性和效率方面将花费大量精力。

您显然需要对数据进行初始载入以创建数据库,但这是一次性的任务。

【讨论】:

    猜你喜欢
    • 2011-08-11
    • 2012-04-21
    • 2010-09-22
    • 1970-01-01
    • 2021-06-11
    • 2020-10-06
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多