私は膨大なファイル(それぞれ4.5GB)を持ち、与えられたトークンで始まる各ファイルの行数を数える必要があります。ファイルごとにトークンが最大200,000回出現することがあります。巨大なファイルの文字列から始まる行を数えるJavaの中で最も速い方法は何ですか
このような巨大なファイルトラバーサルと文字列検出を実現する最速の方法は何でしょうか? Scanner
とString.startsWith()
を使用すると、次の実装より効率的なアプローチがありますか?
public static int countOccurences(File inputFile, String token) throws FileNotFoundException {
int counter = 0;
try (Scanner scanner = new Scanner(inputFile)) {
while (scanner.hasNextLine()) {
if (scanner.nextLine().startsWith(token)) {
counter++;
}
}
}
return counter;
}
注:Scanner
がボトルネックになっているよう
- これまでのところ、それは私がトークン検出よりも複雑な処理を追加し、すべての行でそれを適用した場合、すなわち、全体の実行時間が、より以上である(に見えます以下同じ。)あなたの助けを
事前のおかげでハードウェア側に改善の余地がないので、私はSSDを使用してい
共通!それは重複ではない、あなたが参照している質問を読んだことがありますか?私は20kでない何百万ものファイルを持っているファイルについて話しています。トークンの検出についても話しています。あなたは「重複している」タグはあなたが私の質問を読んでいないことを示しているだけで、あなたが指している質問も表示していません。 – Kraal
質問が終了したので、答えとして投稿することはできませんが、 'grep' [それは何であるか]を見てください(https://stackoverflow.com/questions/12629749/how-does-grep-run -非常に高速)。これは、[Boyer-Moore検索アルゴリズム](https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm)を使用してすべてのバイトを読み取ることを回避します。 – Malt
私はこれも重複しているとは思わない。これはどのようにマークが解除されますか? – mikea