2017-03-24 10 views
-1

ちょっと、私はCSVファイルを読み込むこのプログラムに取り組んでいます。値の列全体を返すメソッドを作る必要があります。Java:リーダープログラムの速度を改善する

現在、私はこのようにそれを行う:

List<String> data = new LinkedList<>(); 

    for(int i = 0; i < getRowCount(); i++){ 
     data.add(getRow(i).get(column)); 
    } 

のgetRow()このある場合は:

List<String> data = new LinkedList<>(); 
    String column; 

    try (BufferedReader bufferedReader = new BufferedReader(new FileReader(file))) { 
     for(int i = 0; i < row; i++){ 
      bufferedReader.readLine(); 
     } 
     column = bufferedReader.readLine(); 
     for(String col: column.split(columnSeparator.toString())){ 
      data.add(col); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

、それが動作します。しかし、欠点は、ファイルに列が多すぎると時間がかかりすぎるということです。それは27 secondso n n 7500行と9列が必要です。 35000行と16列で10分以上。私はそれをもっと速くする方法を知っていますか?

+0

あなたは、各繰り返しの* i *番目の行までファイル全体を処理していることを認識していますか?また、 '列'は何ですか? – shmosel

+0

毎回バッファードリーダーをリメイクしないでください。 – Rogue

+0

@shmoselそれは結局私に感謝しました:D列はgetColumnメソッドの引数です。基本的に私が得たい列の数。 – Erik

答えて

0

をあなたがやっていることは以下の通りです:

  1. (ReaderObjectを、...作成)ファイルを読むために準備し、最初の行を読んで
  2. ファイルを読むために準備し、最初の行を読んで、
  3. 二行目を読んでファイルを読む前に、第1行を読む、第2行を読む、第3行を読む

..など。 明らかに、これはあまり効率的ではありません(あなたの仕事はO(n²)、n =行数)。

あなたは、あなたがそれを行う場合は、このような何か、非常にあなたのコードを向上させることができます:

  1. ファイルを読むために準備

二行目を読んで、最初の行

  • を読みます... 等々。このそれでももちろん

    List<String> data = new LinkedList<>(); 
    
    for(String line : lines) 
        data.add(line.split(columnSeparator.toString())[column]); 
    

    を:あなたは、その後の列にそれらを分割し、あなたが興味を持っているデータを抽出するために行を反復処理することができます

    List<String> lines = new LinkedList<>(); 
    
    try (BufferedReader br = new BufferedReader(new FileReader(file))) { 
        String line; 
        while ((line = br.readLine()) != null) 
         lines.add(line); 
    } catch (IOException e) { 
        e.printStackTrace(); 
    } 
    

    : だから最初に一度にすべての行を読みますエラー処理の少しが必要です:)

  • +0

    あなたのソリューションはどうですかこれよりも速い? for(int i = 0; i Erik

    +0

    私は問題があります。これはサイクルのためのものです。しかし、なぜ? :D – Erik

    +0

    私はgetRowCount()に多くの時間がかかると思います。ループサイクルごとに呼び出すと、この機能は全体的なパフォーマンスに大きな影響を与えます。この方法は何ですか?改善のために、最初にgetRowCount()を1回呼び出して変数に保存してから、この変数をループに使用してください。 –

    0

    私が実行され、この

    DataType<T> listRef = getRowCount(); 
    for(int i = 0; i < listRef.size(); i++) 
        { 
         data.add(getRow(i).get(column)); 
        } 
    

    はgetRowCountをしようとするあなたは文の中でそれを呼び出す毎回あなたを示唆していると、あなたが最終的にすべての行を取得するだろうが、内部的に私は、呼び出し元が、それは行かせると考えていると、 。その方法はgetRowCountに()サイズ()回実行し、あなたはおそらく何回

    +0

    良い点ですが、 'getRow(i)'はそれほど問題になりません。 – shmosel

    +0

    申し訳ありません私はその声明を見て、それはファイルの読み込みと何かであることに気づいていません(私は一度同じことをしました; P)何らかの方法で私に知らせてくれてありがとうございます – YouKnowWhoIAm

    1

    は一度ファイルを読み込むようにしてくださいというファイル読みたくない:

    List<String> getColumn(int column) { 
        try (BufferedReader bufferedReader = new BufferedReader(new FileReader(file))) { 
         List<String> data = new LinkedList<>(); 
         String line = bufferedReader.readLine(); 
         while (line != null) { 
          String cols[] = line.split(columnSeparator.toString()); 
          data.add(cols[column]); 
          line = bufferedReader.readLine(); 
         } 
         return data; 
        } catch (IOException e) { 
         e.printStackTrace(); 
         return null; 
        } 
    }