Я получаю java.lang.OutOfMemoryError: лимит накладных расходов GC превысил исключение при сравнении двух листов Excel, подобных этому
public void compareExcels(String primaryKey, String path1, String path2, String OutPath) throws Exception{
ArrayList<ArrayList<String>> dataSheet1 = new ArrayList<ArrayList<String>>();
ArrayList<ArrayList<String>> dataSheet2 = new ArrayList<ArrayList<String>>();
ExcelUtilities obj = new ExcelUtilities();
/*Read both the worksheets in ArrayList<ArrayList<String>> objects */
/*Apache POI api is used for reading excel data*/
dataSheet1 = obj.readExcel(path1);
dataSheet2 = obj.readExcel(path2);
/* pk holds the key column name using which comparison should be done*/
ArrayList<String> pk = new ArrayList<String>(Arrays.asList(primaryKey.split(";")));
/* compare method takes care of comparing the two ArrayList<ArrayList<String>> objects and returns a map with row number and match result */
HashMap<Integer, String> result = obj.compare(dataSheet1,dataSheet2,pk);
/* Mismatch excel report is created*/
obj.writeToExcel(result, OutPath+"result.xlsx");
}
Приведенный выше код работает абсолютно нормально с несколькими тысячами записей Excel. Но когда размер входных листов увеличивается, скажем, до 50 тыс. Записей на каждом листе Excel, программа запускается в java.lang.OutOfMemoryError: превышен предел издержек GC
Я понимаю -
- java.lang.OutOfMemoryError генерируется, когда виртуальной машине Java не удается выделить объект, потому что ей не хватает памяти, и сборщик мусора не может сделать доступной больше памяти
- Я пытаюсь прочитать огромные объемы данных в два
ArrayList<ArrayList<String>>
объекта, которые могут быть основной причиной этой проблемы
- Чтобы решить эту проблему, можно увеличить размер кучи, указав размер кучи, которую я хочу расширить как
- Xmx - максимальный размер кучи
Но это не элегантное решение. Мне может понадобиться эта программа, чтобы сравнить два листа Excel с одним миллионом записей каждый. Я хочу реализовать эффективный алгоритм с правильными структурами данных. Нужны ваши мысли по этому поводу.