【问题标题】:creating a simple index on a text file in java在java中的文本文件上创建一个简单的索引
【发布时间】:2011-11-22 18:13:41
【问题描述】:

我需要为一个大文本文件实现一个简单的索引方案。文本文件包含键值对,我需要读回特定的键值对而不将完整的文件加载到内存中。文本文件很大,包含数百万个条目,键没有排序。根据用户输入,需要读取不同的键值对。所以我不希望每次都读取完整的文件。请让我知道 java 文件处理 api 中的确切类和方法,这将有助于以简单有效的方式实现这一点。我想在不使用诸如 lucene 之类的外部库的情况下做到这一点。

【问题讨论】:

  • 如果您想要的键值对恰好是文件中的最后一个,那么您将不得不在某个时候阅读整个内容。
  • 如果你试图找到一个不存在的密钥,你必须阅读整个文件。要索引文件,您可以读取一次,避免再次读取。文件有多大?您也许可以全部加载。
  • 对,他必须至少阅读整个文件一次才能对其进行索引。索引它时,您可以跟踪每个键/值对的字节位置。然后,要检索特定的键/值对,您将获取其字节位置,然后跳到文件中的该位置以读取值。但如果值很小,所有这些功能可能不值得,因为索引本身会占用大量内存。
  • @Michael:我需要知道在 java 中能够以简单的方式完成的确切类和函数。文本文件很大,包含数百万个条目,值是长字符串。所以我需要实现一个小索引和方法来跳转到文本文件中的特定条目
  • @vjain27 我不知道如何对文件进行随机访问,但我知道这是可能的。尝试使用 SeekableByteChannel 类。就索引而言,您可能只使用Map,其中映射的键是您的键,映射的值是文件中键/值对的字节位置。

标签: java file-io indexing


【解决方案1】:

正如 cmets 所指出的,在最坏的情况下,您需要对整个文件进行线性搜索,平均搜索一半。但幸运的是,您可以使用一些技巧。

如果文件没有太大变化,则创建一个对条目进行排序的文件副本。理想情况下,使副本中的记录长度相同,这样您就可以直接进入排序文件中的第 N 个条目。

如果您没有磁盘空间,则创建一个索引文件,该文件将原始文件中的所有键作为键,并将原始文件中的偏移量作为值。再次使用固定长度的记录。或者更好的是,将此索引文件设为数据库。或者将原始文件加载到数据库中。无论哪种情况,磁盘存储都非常便宜。

编辑:要创建索引文件,请使用 RandomAccessFile 打开主文件并按顺序读取。在每个条目的开头使用“getFilePointer()”方法来读取文件中的位置,并将该位置加上索引文件中的键存储。查找内容时,从索引文件中读取文件指针并使用 'seek(long)' 方法跳转到原始文件中的点。

【讨论】:

  • 其实我想问一下如何使用java文件处理api创建你提到的索引文件,哪些类/方法将有助于创建和读取索引。
【解决方案2】:

我建议建立一个索引文件。扫描输入文件并将每个键及其偏移量写入List,然后对列表进行排序并将其写入索引文件。然后,每当你想查找一个键时,你就读入索引文件并对列表进行二进制搜索。找到所需的密钥后,以RandomAccessFile 的形式打开数据文件并寻找密钥的位置。然后就可以读取key和value了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    相关资源
    最近更新 更多