Максимальное количество повторяющихся слов в большом файле размером 30 ГБ. - PullRequest
0 голосов
/ 15 июня 2019

Я могу запустить программу для небольшого фрагмента файла, но если файл очень большого размера, и у нас нет такого большого количества памяти, то у нас закончится исключение памяти, что будет лучшим подходом для этой проблемы так что это может быть сделано в памяти с ниже тем же алгоритмом

package com.java.ds.arrays;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;

public class FileRead {

    public static void main(String[] args) {


        HashMap<String, Integer> wordCountMap = new HashMap<String, Integer>();

        BufferedReader reader = null;

        try {
            // Creating BufferedReader object

            reader = new BufferedReader(new FileReader("ser.txt"));

            // Reading the first line into currentLine

            String currentLine = reader.readLine();

            while (currentLine != null) {
                // splitting the currentLine into words

                String[] words = currentLine.toLowerCase().split(" ");

                // Iterating each word

                for (String word : words) {
                    // if word is already present in wordCountMap, updating its count

                    if (wordCountMap.containsKey(word)) {
                        wordCountMap.put(word, wordCountMap.get(word) + 1);
                    }

                    else {
                        wordCountMap.put(word, 1);
                    }
                }


                currentLine = reader.readLine();
            }

            // Getting the most repeated word and its occurrence

            String mostRepeatedWord = null;

            int count = 0;

            Set<Entry<String, Integer>> entrySet = wordCountMap.entrySet();

            for (Entry<String, Integer> entry : entrySet) {
                if (entry.getValue() > count) {
                    mostRepeatedWord = entry.getKey();

                    count = entry.getValue();
                }
            }

            System.out.println("The most repeated word in input file is : " + mostRepeatedWord);

            System.out.println("Number Of Occurrences : " + count);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                reader.close(); // Closing the reader
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

У меня нет большого опыта работы с такими большими файлами. Одна идея, которую я могу придумать

  1. чтение этого файла на куски по 1Гб скажем затем найдите частоту каждого члена в этом и записать в другой файл

  2. затем снова прочитайте следующие куски 1 ГБ найти количество частот каждого участника записать в другой файл

  3. объединить эти два файла и получить пару ключ-значение

Повторите шаги 1 2 и 3

Но теперь уверен, что это будет подходящим подходом, если его, как я буду кодировать это

...