Найти частоту слов из большого файла - PullRequest
1 голос
/ 22 сентября 2019

У меня есть такой текстовый файл:

tom
and
jerry
went
to
america
and
england

Я хочу получить частоту каждого слова, включая частичные совпадения.то есть слово to присутствует в слове tom.Таким образом, мое ожидаемое количество слов to равно 2.

   1 america
   3 and
   1 england
   1 jerry
   2 to
   1 tom
   1 went

Текстовый файл, который у меня есть, составляет 30 ГБ , поэтому невозможно загрузить весь контент в память.Итак, что я сейчас делаю:

  1. чтение входного файла, используя scanner
  2. для каждого слова, находящего частоту, используя этот код:

    Long wordsCount = Files.lines(Paths.get(allWordsFile)) .filter(s->s.contains(word)).count();

т. Е. Для каждого слова я зацикливаю все содержимое файла.Хотя я использую threadpool executor, производительность этого подхода очень низкая.Есть ли лучший способ сделать это?Любые инструменты доступны, чтобы найти частоту слов из большого файла?

Ответы [ 2 ]

1 голос
/ 22 сентября 2019

Предполагая, что есть много повторений, вы можете попробовать что-то вроде этого (написал это с нуля, возможно, не компилируется идеально)

File file = 
  new File("fileLoc"); 
BufferedReader br = new BufferedReader(new FileReader(file)); 

Map <String, Integer> hm = new HashMap<>();
String name;
while ((name = br.readLine()) != null) 
    if(hm.containsKey(name){
        hm.replace(name,hm.get(name) + 1);
    }
    else{
        hm.put(name,1);
    }
} 

РЕДАКТИРОВАТЬ: Я не заметил часть частичных совпаденийно вы должны иметь возможность просто зацикливаться на карте после прочтения входного файла, так что если частичное совпадение просто объединяет значение частичного совпадения со значением совпадения

0 голосов
/ 22 сентября 2019

Наилучшим с точки зрения производительности является чтение строк из файла с помощью BufferedReader и сохранение счетчика слов в HashMap.

...