Я не привык к работе с действительно большими наборами данных, и я здесь как бы неспокойный.Значительная медленная обработка в виде заданного размера превышает 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 статей, поэтому количество слов довольно велико.
Из того, что я понимаю о наборах или, в частности, HashSets, это должен быть человек для работы, так сказать. Сначала все работает довольно гладко, но после 500 000 статей он немного замедляется. Когда он достигает 700 000, его начало становится настолько медленным, что оно в основном останавливается на секунду из двух, прежде чем продолжить. Там где-то есть узкое место, и я не вижу, что это такое.
Любые идеи?
Hashsets поддерживаются hashmaps, как только вы вырастите до большого значения, он должен начать делать глубокие копии своих данных, чтобы убедиться, что столкновения не становятся смешными.Высокие показатели столкновений в конечном итоге превратят ваше постоянное время, выполняя сбор в линейное выполнение. Если вы правильно определяете таблицу, она будет работать более эффективно с надлежащим компромиссом памяти и плавностью работы. –
@GregGiacovelli Просто, чтобы убедиться, что я понимаю ваше предложение; Он должен использовать конструктор HashSet (int initialCapacity), где initialCapacity достаточно высока? Возможно даже использовать Integer.MAX_VALUE? – DoubleDouble
Вы должны понять это для своих нужд и того, что лучше всего работает. Не уверен, насколько велики эти объекты, но, возможно, стоит также изменить loadfactor, чтобы он не был таким же агрессивным. –