2017-11-15 6 views
0

私のプログラムは約2500語のファイルを処理します。 ファイルから両方の単語を含む行の数を取得します。 私はこれのために次のコードを書いています。このプログラムは走るのに約3時間かかります! 私の研究によると、ランタイムが高い理由はストリームを使用するためです。どのようにランタイムを減らすことができますか?java 8のランタイムを減らす

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); 
     } 

UPDATE:実行するためのより多くの時間を持っている部分は、次のコードです:

double pij = (double) SfileLines.get().filter(s -> s.contains(term_i+" ") & s.contains(term_j+" ")).count(); 

私はあまり時間を必要とし、別の方法、プログラムの次の行を記述する必要があります。

+2

ファイルにあなたがを反復処理するたびに読んでいるように、それが見えますループ。 –

+0

'&& 'を短絡する演算子' &&'を変更すると助けになるはずです。 – Eran

+1

ファイルを一度 'List 'に読み込み、 'List'をストリームします。 – Eran

答えて

0

BufferedReader.readLine()は、必要なだけ速く、1秒間に何百万行も読むことができます。

使用例:

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(); 
    } 
+0

最初のコードスニペットは、基本的に 'Files.lines'がフードの中で何をしているのかと全く同じです。 –

+0

全くありません。このメソッドはすべての行を読み込むわけではありません。ストリームが消費されると遅延して読み込まれるため、ストリームを消費しないと行は読み込まれません。 – canillas

+0

しかしこれは 'Files.lines'のやり方でもあります。' BufferedReader.lines'FWIWを使ってファイルから怠惰に読み込まれた行のストリームを生成します。 –

関連する問題