我的程序处理一个大约2500字的文件。 我想获得包含文件中两个单词的行数。 我为此编写了以下代码。这个程序需要大约3个小时才能运行! 根据我的研究,高运行时间的原因是使用流。如何减少运行时间?
Stream<String> fileLines = Files.lines(ngramPath, Charset.defaultCharset());
Supplier<Stream<String>> SfileLines = () -> {
try {
return Files.lines(ngramPath);
} catch (IOException e) {
e.printStackTrace();
}
return fileLines;
};
while (reviews1.hasNext())
{
String term_i = reviews1.next();
reviews2= new Scanner(path);
while(reviews2.hasNext())
{
String term_j = reviews2.next();
if (!term_i.equals(term_j))
{
double pij = (double) SfileLines.get().filter(s -> s.contains(term_i+" ") & s.contains(term_j+" ")).count();
term_i_Ass.put(term_j, pij);
}
}
Total.put(term_i, term_i_Ass);
}
更新:有更多时间运行的部分是以下代码:
double pij = (double) SfileLines.get().filter(s -> s.contains(term_i+" ") & s.contains(term_j+" ")).count();
我需要以不同的方式编写程序的这一行,这需要更少的时间。
答案 0 :(得分:0)
BufferedReader.readLine()速度与您的需求一样快:您可以每秒读取数百万行。
使用示例:
BufferedReader br = null;
FileReader fr = null;
try {
//br = new BufferedReader(new FileReader(FILENAME));
fr = new FileReader(FILENAME);
br = new BufferedReader(fr);
String line;
while ((line= br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null){
br.close();
}
if (fr != null){
fr.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
如果您想使用Stream
,请尝试使用:
try (Stream<String> stream = Files.lines(Paths.get("path to file"))) {
stream.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}