Я читаю около 600 текстовых файлов, а затем анализирую каждый файл по отдельности и добавляю все термины на карту, чтобы узнать частоту каждого слова в 600 файлах.(около 400 МБ).
Мои функции синтаксического анализатора включают в себя следующие шаги (упорядочены):
- поиск текста между двумя тегами, который является соответствующим текстом для чтения в каждом файле.
- нижний регистр всего текста
- string.split с несколькими разделителями.
- создание arrayList со словами вроде этого: "aaa-aa", затем добавление к строке, разделенной выше, идисконтирование "aaa" и "aa" в строку [].(Я сделал это, потому что хотел, чтобы «-» был разделителем, но я также хотел, чтобы «ааа-аа» было только одним словом, а не «ааа» и «аа».
- get String [] и сопоставление с картой = новая HashMap ... (слово, частота)
- печать всего.
У меня уходит около 8 минут и 48 секунд в двухъядерном процессоре2,2 ГГц, 2 ГБ ОЗУ. Я хотел бы получить совет о том, как ускорить этот процесс. Должен ли я ожидать, что он будет таким медленным? И, если возможно, как я могу узнать (в сетевых компонентах), какие функции занимают больше времени для выполнения?
найдено уникальных слов: 398752.
КОД:
File file = new File(dir);
String[] files = file.list();
for (int i = 0; i < files.length; i++) {
BufferedReader br = new BufferedReader(
new InputStreamReader(
new BufferedInputStream(
new FileInputStream(dir + files[i])), encoding));
try {
String line;
while ((line = br.readLine()) != null) {
parsedString = parseString(line); // parse the string
m = stringToMap(parsedString, m);
}
} finally {
br.close();
}
}
РЕДАКТИРОВАТЬ: Проверьте это:
! [Введите описание изображенияздесь] [1]
Я не знаю, что сделать.
РЕДАКТИРОВАТЬ: 80% ВРЕМЕНИ, ИСПОЛЬЗУЕМОЙ С ЭТОЙ ФУНКЦИЕЙ
public String [] parseString(String sentence){
// separators; ,:;'"\/<>()[]*~^ºª+&%$ etc..
String[] parts = sentence.toLowerCase().split("[,\\s\\-:\\?\\!\\«\\»\\'\\´\\`\\\"\\.\\\\\\/()<>*º;+&ª%\\[\\]~^]");
Map<String, String> o = new HashMap<String, String>(); // save the hyphened words, aaa-bbb like Map<aaa,bbb>
Pattern pattern = Pattern.compile("(?<![A-Za-zÁÉÍÓÚÀÃÂÊÎÔÛáéíóúàãâêîôû-])[A-Za-zÁÉÍÓÚÀÃÂÊÎÔÛáéíóúàãâêîôû]+-[A-Za-zÁÉÍÓÚÀÃÂÊÎÔÛáéíóúàãâêîôû]+(?![A-Za-z-])");
Matcher matcher = pattern.matcher(sentence);
// Find all matches like this: ("aaa-bb or bbb-cc") and put it to map to later add this words to the original map and discount the single words "aaa-aa" like "aaa" and "aa"
for(int i=0; matcher.find(); i++){
String [] tempo = matcher.group().split("-");
o.put(tempo[0], tempo[1]);
}
//System.out.println("words: " + o);
ArrayList temp = new ArrayList();
temp.addAll(Arrays.asList(parts));
for (Map.Entry<String, String> entry : o.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
temp.add(key+"-"+value);
if(temp.indexOf(key)!=-1){
temp.remove(temp.indexOf(key));
}
if(temp.indexOf(value)!=-1){
temp.remove(temp.indexOf(value));
}
}
String []strArray = new String[temp.size()];
temp.toArray(strArray);
return strArray;
}
600 файлов,каждый файл размером около 0,5 МБ
EDIT3 # - шаблон больше не компилируется при каждом чтении строки. Новые изображения:
2 :