java - 在java中的文本文件上创建一个简单的索引

标签 java file-io indexing

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

最佳答案

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

如果文件变化不大,则创建文件的副本,其中的条目已排序。理想情况下,使副本中的记录长度相同,以便您可以直接转到已排序文件中的第 N 个条目。

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

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

关于java - 在java中的文本文件上创建一个简单的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8231631/

相关文章:

python - 如何通过 python 调用/运行软件?

c - 从管道打印到屏幕值时输出错误

PHP array_Shift() 突然停止

java - jenkins 和 install4j 集成

java - 进行下一个 Activity 时,ClassLoader 引用了未知路径

java - Hudson JDepend 插件不起作用

java - 从一个特定的表达式树到一个通用的表达式树 - java

java - 如何在 Java 中将 boolean 数组转换为二进制数组,反之亦然?

elasticsearch - 如何在 “more like this”查询中组合不同的索引?

python - 分配(而不是定义)一个 __getitem__ 魔法方法会破坏索引