Ошибка выхода из памяти при сравнении двух больших XML-файлов - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь сравнить два больших XML-файла с использованием XMLUNIT, но получаю "Исключение в потоке" main "java.lang.OutOfMemoryError: Java heap space"

public static void main(String[] args) throws Exception {
    FileReader file = new FileReader("C:/abc/a.xml");

    FileReader file1 = new FileReader("C:/abc/b.xml");
    assertXMLEquals(file, file1);
}


public static void assertXMLEquals(FileReader expectedXML, FileReader actualXML) throws Exception {

        DetailedDiff difference = null;
        try {
            // Checks each Node
            difference = new DetailedDiff(XMLUnit.compareXML(expectedXML, actualXML));
        } catch (Exception e) {

        }

        if (!difference.similar()) {
            List<Difference> AllDifferences = difference.getAllDifferences();
            System.out.println("Xml comparison failed because of follwoing error/s : \n"+AllDifferences);
        }
    }

Решение - я добавил "-Xms2048M -Xmx2048M" в качестве аргументов в конфигурациях Eclipse Run.

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

Я не использовал xmlunit.Но, глядя на документацию xmlunit, похоже, что вы можете использовать потоки в качестве входных данных.

например: BufferedInputStream in = new BufferedInputStream (new FileInputStream (pathname))

Использование потоков не приведет к загрузке всего файла сразу в память.

Но для полученияИсключение OutOfMemoryError: файлы должны быть очень большими.Вы также можете увеличить максимальный размер кучи для приложения при запуске.

Например: увеличение минимального размера кучи (xms) и максимального размера кучи (xmx) до 2 ГБ.

java -Xms2048mm -Xmx2048m

1 голос
/ 02 апреля 2019

Вы пробовали использовать SAX Parser?Это решит вашу проблему, так как не требует загрузки всего файла в память для его обработки.

Кстати, каков размер ваших файлов?

...