如何使用索引文件来提高在大文件中搜索的速度?

时间:2011-03-01 06:14:01

标签: java

我有一个非常大的文件(超过800 MB),我必须尽快(几乎5秒)搜索用户输入的字符串。我创建了一个索引文件,它存储了每行的数量以及该行中字符串的第一个字节的数量。我想使用索引文件来获取字符串的第一个字节的数字,并使用它来通过seek()读取原始文件中的相关字符串。

现在我遇到了这个问题:

如果用户输入的字符串是文件中的最后一个字符串,我必须读取整个索引文件以获取其第一个字节的编号。这需要很多时间。如何避免读取整个索引文件?是否有人可以帮助我使用此索引文件在很短的时间内在我的原始文件中进行搜索。

3 个答案:

答案 0 :(得分:2)

实现此目的的简单方法是使用现有的文本搜索引擎,例如Lucene。这应该为您提供以毫秒为单位的搜索时间。

如果你想自己去实现这个(不可忽视的)努力,那么你需要做的就是创建一个反向索引。这实际上是一个多映射,其键由输入文本(您的大文件)的单词组成,其值是每个单词每次出现的位置。当然,这将太大而无法保存在内存中,因此您必须设计和实现高效的基于光盘的数据结构......以及用于构建和查询它们的软件。

答案 1 :(得分:0)

Tries:非常快(O(m),其中m是单个字符串的长度)) 但不是那么好的空间复杂性。在googcle-code here中有一个开放的实现。

当然你也可以使用散列图,但更糟糕的是搜索的复杂性是O(n)。

答案 2 :(得分:0)

如果您想自己这样做,如果您的索引适合内存,那么您可以考虑执行以下操作:

class Index {
    String beginning;
    long location;
}


public class IndexComparator implements Comparator<Index> {
    @Override
    public int compare(Index o1, Index o2) {
        return o1.beginning.compareTo(o2.beginning);
    }
}

public class Main {
    public static void main(String[] args) {
        IndexComparator comparator = new IndexComparator();

        Index[] indexes = {new Index("one", 10), new Index("two", 20), 
                           new Index("three", 30)};
        Arrays.sort(indexes, comparator);

        int i = Arrays.binarySearch(indexes, new Index("two", 0), comparator);

        System.out.println(indexes[i].location); // prints: 20 (correct location)
    }
}