プログラムでtxtファイルを読み取る必要があります。現在、FileReader と BufferedReader を使用しています。Scanner を使用しようとしましたが、FileReader や BufferedReader よりも低速です。ファイルをより速く読み取ることができるクラスはありますか? Java言語で書かれている必要があります。
テキストファイルからすべての単語(空白で区切られた文字列)を読み取る必要があります
メモリ内のすべてのファイルを読み取ると仮定すると、コード記述の観点から最速は次のとおりです。
List<String> lines = Files.readAllLines(yourFile, charset);
パフォーマンスは、実行の観点からは、それ以上ではないにしても、同じくらい良いものになると思います (これは、それを書いたチームによって最適化されていると思われます)。
その後、必要なことを分割または実行できます。
読み取りと分割の速度は です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
ファイルが大きい場合、 Files.readAllLines は機能しません。それでも NIO を試してみたい場合は、簡単です。
FileInputStream fis = new FileInputStream("test.txt");
Reader rdr = Channels.newReader(fis.getChannel(), "UTF-8");
BufferedReader br = new BufferedReader(rdr);
...
読み取られるファイルが巨大な場合は、読み取りパフォーマンスを向上させるため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;
}