Невозможно сохранить большие CSV-файлы в hashmap - PullRequest
0 голосов
/ 04 ноября 2019

Я не могу сохранить файлы CSV в hashmap из hashmap из-за OutOfMemoryError.

Формат файла CSV: слово, количество

Внешний хэш-карта: HashMap> - Для хранения языкового кода и хэш-карты

Внутренний хэш-карта: HashMap - Для хранения слова и количества

Я пытаюсь просмотреть список файлов .csv (51) с общим объемом памяти 145 МБ на сервере Tomcat, Eclipse. Но я получаю OutOfMemoryError. Есть ли API для преобразования csv в hashmap в java вместо итерации файла csv построчно?

private static HashMap<String, HashMap<String, Long>> wordCountAllLang = new HashMap<String, HashMap<String, Long>>();
    public static void fetchWordCount(){
        HashMap<String, Long> wordCountMap;
        String language, line;
        String[] lineArr;
        BufferedReader in = null;
        try{
            final File folder = new File(ProofingConstants.DICTIONARY.WORD_COUNT_DATA_FOLDER_PATH);
            for (File fileEntry : folder.listFiles()) {
                language = fileEntry.getName().replace(".csv", ""); //No i18n
                LOGGER.log(Level.WARNING, "Language:###"+language);
                if (!isDictionaryLanguage(language)){
                    continue;
                }
                //Reading the file contents and putting it in the hash map
                wordCountMap = new HashMap<String, Long>();
                try{
                    in = new BufferedReader(new FileReader(fileEntry));
                    while ((line = in.readLine()) != null) {
                        lineArr = line.split(",");
                        wordCountMap.put(lineArr[0], Long.parseLong(lineArr[1]));
                    }

                }
                catch(Exception e) {
                    LOGGER.log(Level.WARNING, "SEVERE_ERROR: Exception while reading csv file data into hashmap", e);
                }
                finally{
                    in.close();
                }

                //Storing the hashmap in another hash map using language as its key
                wordCountAllLang.put(language, wordCountMap);
                LOGGER.log(Level.WARNING, "Language completed");
            }
        }
        catch(Exception e) {
            LOGGER.log(Level.WARNING, "SEVERE_ERROR: Exception while getting word count from csv file", e);
        }
    }

"исключение: OutOfMemoryError"

1 Ответ

0 голосов
/ 04 ноября 2019

Вы можете увеличить максимальный размер кучи, передав -Xmx128m. впоследствии, если это не поможет, вы можете еще больше увеличить размер.

Также вы можете проверить то же самое, используя код Java: -

// Get current size of heap in bytes
long heapSize = Runtime.getRuntime().totalMemory();

// Get maximum size of heap in bytes. The heap cannot grow beyond this size.
long heapMaxSize = Runtime.getRuntime().maxMemory();

// Get amount of free memory within the heap in bytes. This is dynamic.
long heapFreeSize = Runtime.getRuntime().freeMemory();
...