0

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

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

欢迎您的建议!

4

2 回答 2

0

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

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

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

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

于 2012-12-06T11:21:25.717 回答
0

我会使用Java Chronicle或类似的东西(部分是因为我编写了它),因为它旨在随机访问大量数据(比您的机器大)。

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

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

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

它几乎不使用堆(对于 TB 的数据,<1 MB)

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

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

于 2012-12-06T11:23:42.583 回答