申し訳ありませんが、コードを投稿できませんが、バッファー サイズとして 50000000 バイトが設定された bufferedreader があります。HDD ライトが 2 分ごとに点滅し、大量のデータを読み取り、CPU が処理するにつれて再び静かになります。しかし、約 30 分後 (これは非常に大きなファイルです)、一度に 1 バイトずつ読み取っているように、HDD がスラッシングを開始します。それはまだ同じループにあり、空きRAMをチェックしてスワッピングを除外したと思います(ヒープサイズはデフォルトです)。
役に立つ回答は得られないかもしれませんが、試してみる価値はあります。
OKヒープサイズを768mbに変更しましたが、まだ何もありません。十分な空きメモリがあり、java.exe は約 300 MB しか使用していません。
今、私はそれをプロファイリングしましたが、ヒープは約 200MB にとどまり、利用可能な量をはるかに下回っています。CPU は 50% のままです。それでも、HDD は狂ったようにスラッシングし始めます。何も思いつきません。すべてを C# で書き直すつもりです。それが私の解決策です。
コードは次のとおりです (これは使い捨てのスクリプトであり、きれいではありません)。
BufferedReader s = null;
HashMap<String, Integer> allWords = new HashMap<String, Integer>();
HashSet<String> pageWords = new HashSet<String>();
long[] pageCount = new long[78592];
long pages = 0;
Scanner wordFile = new Scanner(new BufferedReader(new FileReader("allWords.txt")));
while (wordFile.hasNext()) {
allWords.put(wordFile.next(), Integer.parseInt(wordFile.next()));
}
s = new BufferedReader(new FileReader("wikipedia/enwiki-latest-pages-articles.xml"), 50000000);
StringBuilder words = new StringBuilder();
String nextLine = null;
while ((nextLine = s.readLine()) != null) {
if (a.matcher(nextLine).matches()) {
continue;
}
else if (b.matcher(nextLine).matches()) {
continue;
}
else if (c.matcher(nextLine).matches()) {
continue;
}
else if (d.matcher(nextLine).matches()) {
nextLine = s.readLine();
if (e.matcher(nextLine).matches()) {
if (f.matcher(s.readLine()).matches()) {
pageWords.addAll(Arrays.asList(words.toString().toLowerCase().split("[^a-zA-Z]")));
words.setLength(0);
pages++;
for (String word : pageWords) {
if (allWords.containsKey(word)) {
pageCount[allWords.get(word)]++;
}
else if (!word.isEmpty() && allWords.containsKey(word.substring(0, word.length() - 1))) {
pageCount[allWords.get(word.substring(0, word.length() - 1))]++;
}
}
pageWords.clear();
}
}
}
else if (g.matcher(nextLine).matches()) {
continue;
}
words.append(nextLine);
words.append(" ");
}