java.lang.OutOfMemoryError: превышен лимит накладных расходов GC при сравнении двух файлов Excel - PullRequest
0 голосов
/ 26 апреля 2018

Я получаю 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

Я понимаю -

  1. java.lang.OutOfMemoryError генерируется, когда виртуальной машине Java не удается выделить объект, потому что ей не хватает памяти, и сборщик мусора не может сделать доступной больше памяти
  2. Я пытаюсь прочитать огромные объемы данных в два ArrayList<ArrayList<String>> объекта, которые могут быть основной причиной этой проблемы
  3. Чтобы решить эту проблему, можно увеличить размер кучи, указав размер кучи, которую я хочу расширить как
    • Xmx - максимальный размер кучи

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

...