我有一个包含74027条记录(只有一列)的大型文本文件(。txt),按字母顺序排列 。在那些记录中,我需要找到一条记录。
我有这段代码 -
BufferedReader reader = new BufferedReader(new FileReader("/###/myfile.txt"));
String line = null;
while ((line = reader.readLine()) != null) {
Pattern.compile(Pattern.quote(s2), Pattern.CASE_INSENSITIVE).matcher(s1).find();
//...
}
但是这段代码需要很长时间才能找到记录,因为它逐行读取文件。但由于我按字母顺序排列记录,有没有办法更有效地找到记录?
答案 0 :(得分:2)
在while循环外编译模式:
Pattern pattern = Pattern.compile(Pattern.quote(s2), Pattern.CASE_INSENSITIVE);
while ((line = reader.readLine()) != null) {
pattern.matcher(s1).find();
//...
}
答案 1 :(得分:1)
文件是一种顺序数据结构,只允许线性搜索,这当然是线性时间。为了最大限度地提高这一点,您需要更改数据结构,以便允许随机访问二进制搜索。我可以想到几种方法:
重新格式化您的文件格式,以便您可以随机访问它。这意味着您需要使每个记录的大小相同。
将整个文件读入适当的内存数据结构,可能只是一个ArrayList。
编写您自己的数据结构,为您当前的文件格式提供随机访问接口。
如果这些都不可行,那么您将不得不接受对当前线性搜索的微小优化。这些优化只会影响常数因素而不会改变运行时复杂性,因此其优势比以前的建议更有限。
答案 2 :(得分:1)
以大块的形式读取文本,一次说500行(100个字符/行,大约50K)
读入前两个完整的块。找到第二个块中的第一个完整行(找到第一个换行符,然后到达下一个换行符。)
如果第一个完整行按字母顺序小于您要搜索的模式,则可以丢弃整个上一个块而不对其进行任何模式搜索。
对每个块重复(检查第一个完整行并丢弃前一个块,如果它小于目标模式)
当您找到第一个完整行大于您的模式的块时,然后将该块开头的部分行(第一个完整行之前的文本)附加到上一个块的末尾,然后搜索感兴趣的模式的前一个块。
如果到达最后一个区块且第一个完整线条小于模式,则在最后一个区块中搜索您感兴趣的模式。