我不習慣使用真正大的數據集,我在這裏難倒了。顯着較慢的處理,因爲設置大小超過了500.000
我有以下代碼:
private static Set<String> extractWords(BufferedReader br) throws IOException {
String strLine;
String tempWord;
Set<String> words = new HashSet<String>();
Utils utils = new Utils();
int articleCounter = 0;
while(((strLine = br.readLine()) != null)){
if(utils.lineIsNotCommentOrLineChange(strLine)){
articleCounter++;
System.out.println("Working article : " + utils.getArticleName(strLine) + " *** Article #" + articleCounter + " of 3.769.926");
strLine = utils.removeURLs(strLine);
strLine = utils.convertUnicode(strLine);
String[] temp = strLine.split("\\W+");
for(int i = 0; i < temp.length; i++){
tempWord = temp[i].trim().toLowerCase();
if(utils.validateWord(tempWord)){
words.add(tempWord);
System.out.println("Added word " + tempWord + " to list");
}
}
}
}
return words;
}
這基本上得到從BufferedReader中,其中的每一行文本是從文章文本巨大的文本文件。我想在這個文本文件中列出唯一的單詞,但是其中有3.769.926條文章,因此單詞數量非常龐大。
從我對Sets或HashSet的理解來看,這應該是這個職業的人可以這麼說。一開始一切運轉都很順利,但是在500.000篇文章開始放緩之後。當它達到700.000時,它開始變得足夠慢,基本上在一秒鐘之後停止,然後再繼續。這裏有一個瓶頸,我看不到它是什麼..
任何想法?
哈希集由hashmaps支持,一旦你發展到一個很大的價值,它必須開始做它的數據的深層副本,以確保碰撞不會變得荒謬。高度的碰撞計數最終會使您的執行採集的時間線性化。如果您正確調整表格的大小,它將在內存和性能平穩的情況下更有效地運作 –
@GregGiacovelli只是爲了確保我理解您的建議;他應該使用HashSet(int initialCapacity)構造函數,其中initialCapacity相當高?可能甚至使用Integer.MAX_VALUE? – DoubleDouble
你必須弄清楚你的需求和最佳效果。不知道這些對象有多大,但它可能也值得更改負載因子也不要太積極 –