2012-11-20 10 views
5

私のプログラムではtxtファイルを読む必要があります。私は現在FileReaderとBufferedReaderを使っています。 Scannerを使用しようとしましたが、FileReaderとBufferedReaderよりも遅いです。ファイルをより速く読み取ることができるクラスはありますか? Java言語で記述する必要があります。私は、テキストファイルからすべての単語(空白でsplited文字列)を読む必要がJavaは、txtファイルから読み取る最も速いクラスです。

+2

ファイルからの読み込みがプログラムのボトルネックであるという具体的な証拠はありますか?後でデータを使って何をやっていますか?ファイルのサイズはどれくらいですか?私は 'FileReader'自身を避けることに注意してください - あなたが明示的にエンコーディングを設定できるように' FileInputStream'をラップする 'InputStreamReader'を使用してください。 –

+0

ファイルを読むのではなく、ボトルネックが行を分割しているのでしょうか? String.split()を高速化する方法があります。私の経験から、BufferedReaderは非常に高速です。 – Serg

+0

理論的には、Java NIOはIOよりも速くファイルを読み取ることができます –

答えて

1

読み取り中のファイルが巨大な場合は、FileReaderの上にBufferedReaderを使用して読み取りパフォーマンスを向上させます。

またはあなたがlikethis何かを試す可能性があります -

BufferedReader br = new BufferedReader(new FileReader("file.txt")); 
try { 
    StringBuilder sb = new StringBuilder(); 
    String line = br.readLine(); 

    while (line != null) { 
     sb.append(line); 
     sb.append("\n"); 
     line = br.readLine(); 
    } 
    String everything = sb.toString(); 
    } finally { 
    br.close(); 
} 

またはあなたがこのプログラムを試すことができます。これは、大きなファイルのために高速に動作します -

public String readDoc(File f) { 
String text = ""; 
int read, N = 1024 * 1024; 
char[] buffer = new char[N]; 

try { 
    FileReader fr = new FileReader(f); 
    BufferedReader br = new BufferedReader(fr); 

    while(true) { 
     read = br.read(buffer, 0, N); 
     text += new String(buffer, 0, read); 

     if(read < N) { 
      break; 
     } 
    } 
} catch(Exception ex) { 
    ex.printStackTrace(); 
} 

return text; 
} 
+0

読み込もうとするファイルは大きくなる可能性があります(100 MB以上)。 は今、私はより速くそれを行うことができます http://pastebin.com/WUaJUT1G のようにこれをやってイム? 私は大学でのプロジェクトのためにやっています。私はできる限り速くプログラムのすべての断片を作成する必要があります(リーディング、ツリーの作成、ツリー内の検索)。 – user1736332

+0

このアプローチはより良いアプローチです。私はそれをチェックした。 –

+0

@ user1736332: - 私は大きなファイルに対して速く動作するコードで自分の答えを更新しました。親切にチェックしてください。 –

2

コードの書き込みの観点から、最速、あなたがメモリ内のすべてのファイルを読み込むと仮定は、次のとおりです。

List<String> lines = Files.readAllLines(yourFile, charset); 

私は、実行の観点からは、パフォーマンスはそれほど良くないと思うでしょう(これは、それを書いたチームによって最適化されたと思われます)。

これで分割したり、必要な処理を行うことができます。

1

読書と分裂の速度が85 MB/secです。 各行に20列の560MBのファイルを使用しました。 、分割なし:更新

read 561362951 bytes in 6575 ms 

:私はsplitted = line.split(",");代わりにsplit(line);を使用する場合 、速度が32 MB/sec アップデート2に低下

package csvreader_speedtest; 

import java.io.*; 

public class Csvreader_SpeedTest { 

    final char delimiter = ','; 
    String[] splitted = new String[64]; 

    Csvreader_SpeedTest(String filename) throws Throwable { 
     File file = new File(filename); 
     BufferedReader reader = new BufferedReader(new FileReader(file)); 
     String line; 
     long t0 = System.currentTimeMillis(); 
     while ((line = reader.readLine()) != null) { 
      split(line); 
     } 
     long t1 = System.currentTimeMillis(); 
     reader.close(); 
     System.out.println("read " + file.length() + " bytes in " + (t1 - t0) + " ms"); 
    } 

    private void split(String line) { 
     int idxComma, idxToken = 0, fromIndex = 0; 
     while ((idxComma = line.indexOf(delimiter, fromIndex)) != -1) { 
      splitted[idxToken++] = line.substring(fromIndex, idxComma); 
      fromIndex = idxComma + 1; 
     } 
     splitted[idxToken] = line.substring(fromIndex); 
    } 
} 

出力:ここ コードであります速度は194 MB/secです。どのくらい速くする必要がありますか?

+0

/のような記号をすべて置き換える必要があります。 、! ? - ()[] {}:; '' '' '' ''(スペース)に分割し、その後に空白をすべて空白に分割する方法を教えてください。 – user1736332

+0

これは間違いなく異なる質問です。スペースの文字列のすべての外観を置き換える最速の方法は? – Serg

1

ファイルが大きい場合はFiles.readAllLinesは機能しません。しかし、まだNIOを試してみたいのであれば、それは簡単です:

関連する問題