【发布时间】:2011-11-22 18:13:41
【问题描述】:
我需要为一个大文本文件实现一个简单的索引方案。文本文件包含键值对,我需要读回特定的键值对而不将完整的文件加载到内存中。文本文件很大,包含数百万个条目,键没有排序。根据用户输入,需要读取不同的键值对。所以我不希望每次都读取完整的文件。请让我知道 java 文件处理 api 中的确切类和方法,这将有助于以简单有效的方式实现这一点。我想在不使用诸如 lucene 之类的外部库的情况下做到这一点。
【问题讨论】:
-
如果您想要的键值对恰好是文件中的最后一个,那么您将不得不在某个时候阅读整个内容。
-
如果你试图找到一个不存在的密钥,你必须阅读整个文件。要索引文件,您可以读取一次,避免再次读取。文件有多大?您也许可以全部加载。
-
对,他必须至少阅读整个文件一次才能对其进行索引。索引它时,您可以跟踪每个键/值对的字节位置。然后,要检索特定的键/值对,您将获取其字节位置,然后跳到文件中的该位置以读取值。但如果值很小,所有这些功能可能不值得,因为索引本身会占用大量内存。
-
@Michael:我需要知道在 java 中能够以简单的方式完成的确切类和函数。文本文件很大,包含数百万个条目,值是长字符串。所以我需要实现一个小索引和方法来跳转到文本文件中的特定条目
-
@vjain27 我不知道如何对文件进行随机访问,但我知道这是可能的。尝试使用
SeekableByteChannel类。就索引而言,您可能只使用Map,其中映射的键是您的键,映射的值是文件中键/值对的字节位置。