减少java 8中的运行时

时间:2017-11-15 12:01:36

标签: java stream runtime

我的程序处理一个大约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();

我需要以不同的方式编写程序的这一行,这需要更少的时间。

1 个答案:

答案 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();
    }