6

プログラムでtxtファイルを読み取る必要があります。現在、FileReader と BufferedReader を使用しています。Scanner を使用しようとしましたが、FileReader や BufferedReader よりも低速です。ファイルをより速く読み取ることができるクラスはありますか? Java言語で書かれている必要があります。

テキストファイルからすべての単語(空白で区切られた文字列)を読み取る必要があります

4

4 に答える 4

2

メモリ内のすべてのファイルを読み取ると仮定すると、コード記述の観点から最速は次のとおりです。

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

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

その後、必要なことを分割または実行できます。

于 2012-11-20T19:05:08.927 に答える
1

読み取りと分割の速度は です85 MB/sec。各行に 20 列の 560 MB のファイルを使用しました。コードは次のとおりです。

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

出力:

read 561362951 bytes in 6575 ms

更新:splitted = line.split(",");の代わり に使用すると、速度が更新 2split(line);に低下します:分割せずに、速度は. どのくらい速くする必要がありますか?32 MB/sec 194 MB/sec

于 2012-11-20T19:46:21.910 に答える
1

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

FileInputStream fis = new FileInputStream("test.txt");
Reader rdr = Channels.newReader(fis.getChannel(), "UTF-8");
BufferedReader br = new BufferedReader(rdr);
...
于 2012-11-20T19:47:01.767 に答える
1

読み取られるファイルが巨大な場合は、読み取りパフォーマンスを向上させるためBufferedReaderに の上で使用することをお勧めします。FileReader

または、次のようなものを試すことができます:-

 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;
}
于 2012-11-20T19:06:09.313 に答える