Javaを使用して、ファイル内に空でない行がいくつあるかを調べる最速の方法は何ですか?Javaを使用して空でない行がファイル内にいくつあるかを調べる最も速い方法は何ですか?
答えて
私はNIO勧告でLimbic Systemを使用しています。私は彼の二つの方法に対してそれをマークしダフナのテストコードとベンチにNIOメソッドを追加しました:ここ
public static void timeNioReader() throws IOException {
long bef = System.currentTimeMillis();
File file = new File("/Users/stu/test.txt");
FileChannel fc = (new FileInputStream(file)).getChannel();
MappedByteBuffer buf = fc.map(MapMode.READ_ONLY, 0, file.length());
boolean emptyLine = true;
int counter = 0;
while (buf.hasRemaining())
{
byte element = buf.get();
if (element == '\r' || element == '\n') {
if (!emptyLine) {
counter += 1;
emptyLine = true;
}
} else
emptyLine = false;
}
long after = System.currentTimeMillis() - bef;
System.out.println("timeNioReader Time: " + after + " Result: " + counter);
}
は、89メガバイトのファイルのためのウォームアップの結果は以下のとおりです。
timeBufferedReader Time: 947 Result: 747656
timeFileReader Time: 670 Result: 747656
timeNioReader Time: 251 Result: 747656
NIOが2.5倍高速でありますBufferedReaderよりもFileReaderおよび4x fastserよりも優れています。
6.4MBのファイルでは、ウォームアップ時間がはるかに長いものの、結果はさらに向上します。
//jvm start, warming up
timeBufferedReader Time: 121 Result: 53404
timeFileReader Time: 65 Result: 53404
timeNioReader Time: 40 Result: 53404
//still warming up
timeBufferedReader Time: 107 Result: 53404
timeFileReader Time: 60 Result: 53404
timeNioReader Time: 20 Result: 53404
//ripping along
timeBufferedReader Time: 79 Result: 53404
timeFileReader Time: 56 Result: 53404
timeNioReader Time: 16 Result: 53404
あなたはそれをしてください。
最も簡単なのはスキャナです(私は冗長コードが好きです...物理的に短くすることができます)。 Scanner()はFile、Readerなども受け取ります。あなたが持っているものを渡すことができます。
import java.util.Scanner;
public class Main
{
public static void main(final String[] argv)
{
final Scanner scanner;
final int lines;
scanner = new Scanner("Hello\n\n\nEvil\n\nWorld");
lines = countLines(scanner);
System.out.println("lines = " + lines);
}
private static int countLines(final Scanner scanner)
{
int lines;
lines = 0;
while(scanner.hasNextLine())
{
final String line;
line = scanner.nextLine();
if(line.length() > 0)
{
lines++;
}
}
return lines;
}
}
最も簡単な方法は、BufferedReaderを使用して、どの行が空であるかを確認することです。ただし、ファイル内のすべての行に対してStringオブジェクトを作成する必要があるため、これは比較的遅い方法です。より高速な方法は、read()を使ってファイルを配列に読み込んだ後、配列を繰り返して改行を数えさせることです。
ここでは2つのオプションのコードを示します。 2番目のマシンはマシンの約50%を占めていました。
public static void timeBufferedReader() throws IOException
{
long bef = System.currentTimeMillis();
// The reader buffer size is the same as the array size I use in the other function
BufferedReader reader = new BufferedReader(new FileReader("test.txt"), 1024 * 10);
int counter = 0;
while (reader.ready())
{
if (reader.readLine().length() > 0)
counter++;
}
long after = System.currentTimeMillis() - bef;
System.out.println("Time: " + after + " Result: " + counter);
}
public static void timeFileReader() throws IOException
{
long bef = System.currentTimeMillis();
FileReader reader = new FileReader("test.txt");
char[] buf = new char[1024 * 10];
boolean emptyLine = true;
int counter = 0;
while (reader.ready())
{
int len = reader.read(buf,0,buf.length);
for (int i = 0; i < len; i++)
{
if (buf[i] == '\r' || buf[i] == '\n')
{
if (!emptyLine)
{
counter += 1;
emptyLine = true;
}
}
else emptyLine = false;
}
}
long after = System.currentTimeMillis() - bef;
System.out.println("Time: " + after + " Result: " + counter);
}
実際にできるだけ速くする必要がある場合は、NIOを調べる必要があります。そして、あなたのターゲットプラットフォーム上のあなたのコードが、NIOを使って本当に本当に良いかどうかを見てください。私はNetflix Prizeのために遊んでいたいくつかのコードで、大きさの改善を得ることができました。何千ものファイルをよりコンパクトで高速なバイナリ形式に構文解析することが含まれていました。 NIOは私の(遅い)開発ラップトップの大きな助けとなりました。
- 1. テーブルにpostgreSQLの行がないかどうかを調べる最速の方法は何ですか?
- 2. Apacheのaccess.logファイルを調べる最も良い方法は何ですか?
- 3. ポイントがポリゴンのポリゴンの内側にあるかどうかを調べる最も速い方法は
- 4. b3を使用してs3バケットを空にする最も速い方法は何ですか?
- 5. 数値が範囲内にあるかどうかを調べる最も速い方法
- 6. Javaでは、システム時間を得る最も速い方法は何ですか?
- 7. Java:リフレクションを使用してフィールドを注入する最も速い方法は何ですか?
- 8. デスクトップをストリーミングする最も速い方法は何ですか?
- 9. タイプをチェックする最も速い方法は何ですか?
- 10. 3D座標がすでに使用されているかどうかを調べる最速の方法
- 11. ファイルからStringを読み取る最も速い方法は何ですか?
- 12. ストア内にいくつのステータスオブジェクトがあるかを調べる
- 13. ライブWebアプリケーションにいくつかのログを挿入する最も速い方法は何ですか?
- 14. 2つのテーブル間で一致しないレコードを見つける最も速い方法は何ですか?
- 15. 現在、JavaでいくつのCPUコアが空いているかを調べるには
- 16. ファイルを上書きする最も速い方法は何ですか?
- 17. プロセスが何をしているかを調べる方法は?
- 18. ペアの配列で最も近い数のペアを見つける最も速い方法は何ですか?
- 19. データベース内の多くの行を更新する最も速い方法は何ですか?
- 20. csvファイルからn個のランダムな行を選択する最も速い方法は何ですか?
- 21. いくつかのドッカー作成で同じドッカーサービスを使用する最も良い方法は何ですか?
- 22. Javaのスタック内の最大要素を検索する最も速い方法は何ですか?
- 23. ngForの内部でngIFを使用していくつかの値が空であるかどうかを表示しない方法はありますか?
- 24. OpenCVを使用してPythonでCvMatを反復する最も速い方法は何ですか?
- 25. C++でファイル内の行数を調べる最もコンパクトな方法
- 26. C#を使用してコンボボックスのドロップダウンに項目を追加する最も速い方法は何ですか?
- 27. Javaを使用してファイルがどのフォルダに属しているかを調べる方法は?
- 28. データテーブルに行があるか空であるかを調べる
- 29. C#/ .NETを使用してファイル内のテキストを置換する最も良い方法は何ですか?
- 30. matlabで行列が空であるかどうかを調べる方法は?
あなたが投票した理由を言わなかったので、「最速」には2つの意味があります。最速の実行と最速の開発です。 「最も速い」という意味の場合には、最も簡単に開発することができました。それが別の理由であった場合、下院の理由を知ってうれしいです。 – TofuBeer