2017-04-25 5 views
-1

私は、100万のレコードを含むテキストファイルの1つを持っています。私はファイルを読むために非常に古い方法を使用していますが、メモリの問題のために時間がかかり、完了できませんでした。私は、Javaを使用するか、どんな外部ライブラリを使用してファイルを読むために最善かつ最適な方法をお勧めすることができます場合は、本当に感謝しています。(最終的な解決策は、時間がかかるを減少させるべきである)ここで私は前述したように私のコードで、また使用javaを使用してファイルを読み取る最も効率的な方法は何ですか?

BufferedReader reader = null; 

    List<String> fileLines = new ArrayList<String>(); 
    String line = ""; 
    reader = new BufferedReader(new java.io.FileReader(file)); 
    while ((line = reader.readLine()) != null) { 
     fileLines.add(line); 
    } 
    reader.close(); 
    return fileLines; 

別の方法ですが、結果は同じです。

public static void fileReading(File file, Object executingClass, String methodName, int size) throws IOException { 
    try { 
     Method method = executingClass.getClass().getMethod(methodName, List.class); 

     BufferedReader reader = null; 

     List<String> fileLines = new ArrayList<String>(); 
     String line = ""; 
     reader = new BufferedReader(new java.io.FileReader(file)); 
     int track = 0; 
     while ((line = reader.readLine()) != null) { 
      track++; 
      fileLines.add(line); 

      if (0 == track % size) { 
       method.invoke(executingClass, fileLines); 
       fileLines.clear(); 
      } 
     } 

     if (!fileLines.isEmpty()) { 
      method.invoke(executingClass, fileLines); 
      fileLines.clear(); 
     } 

     reader.close(); 


    } catch (NoSuchMethodException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } catch (InvocationTargetException e) { 
     e.printStackTrace(); 
    } 
} 
+3

メモリにそれらのすべてを格納することなく、記録を1つずつ処理するようにしてください。 – Berger

+1

各行をリストに追加してファイル全体をメモリに読み込もうとしています。 JavaのJVMにはデフォルトで〜1GBの制限があります(ただし、増やすことはできます)。なぜあなたは一度に各行を読むことができません、あなたが必要とする処理をしてからそれを投げ捨てるのですか? – Michael

+0

私の質問を更新してください。私の新しいメソッドを使用して私は一度に1000文字列のリストを取得し、それを処理します。 –

答えて

1

次の2つの選択肢があります:

1 - 好ましくは、ファイル全体を読み込み、メモリに格納しないでください。 1行(またはエントリを表す行のグループ)を読み込んで処理し、ファイル内のすべての行についてそれを繰り返すだけです。

2 - ファイル全体を実際にメモリに保存する必要がある場合は、JVMヒープのサイズを大きくしてみてください。

+1

"ファイル全体をメモリに格納する必要が本当に必要な場合は..."、そうしないとアルゴリズムが改訂されません。 – Michael

-1

次の引数を渡すことで、JavaのJVMに割り当てられたメモリを拡大してみてください。mは、MIBを示し

-Xms=3000m -Xmx=5000m 

。 GiBにはgを使用することもできます。

http://www.rgagnon.com/javadetails/java-0131.html

+0

これを行う必要がある場合にのみ実行してください。彼はおそらく必要はありません。 – Michael

+0

私は知りません。 –

関連する問題