Максимальный размер при анализе XML с помощью DOM

В настоящее время я реализую клиент REST, который будет анализировать сообщения ответа XML. Предполагается, что он будет запущен на Android-устройстве. Таким образом, скорость памяти и скорость обработки – довольно большая проблема. Однако за один раз будет только один ответ XML, поэтому обработка или хранение нескольких XML-документов одновременно не является проблемой.

Как я понял, есть три способа анализа XML с Android SDK:

  • SAX
  • XmlPullParser
  • DOM

Читая об этих различных методах разбора, я получил, что SAX рекомендуется для больших XML-файлов, поскольку он не будет содержать полное дерево в памяти, например DOM.

Тем не менее, я спрашиваю себя, что такое большие килобайты, мегабайты, …? Есть ли практический размер, до которого не имеет значения, используется ли SAX или DOM?

Благодаря,
Роберт

Стандартных ограничений для документов XML и DOM не существует, поэтому он полностью зависит от того, с чем может справиться хост-машина.

По мере внедрения на Android вы должны принять довольно ограниченный объем памяти и помнить DOM, парсер XML, вашу логику программы, логику отображения, сам JVM и Android, все должны вписаться в доступную память !.

Как правило, вы можете ожидать, что память DOM занимает около четырех раз больше исходного XML-документа. Так что предположим, что 512 МБ доступной памяти, постарайтесь взять не более половины этого для вас DOM, и вы получите 512/8 или практический максимум 64 МБ для XML-документа.

Чтобы быть в безопасности, я бы вдвое меньше, чем 32 МБ макс. Поэтому, если вы ожидаете многих документов такого размера, я бы использовал swithc для анализа SAX !.

Если вы хотите, чтобы приложение отвечало с любой скоростью на больших документах, SAX – это путь. Анализатор SAX может начинать возвращать результаты, как только первый элемент считывается, DOM-парсеру необходимо прочитать весь документ, прежде чем какой-либо вывод может быть отправлен в вашу программу.

Выдержка из этой статьи :

Парсер DOM страдает от раздувания памяти. С меньшими наборами XML это не такая проблема, но по мере роста размера XML парсы DOM становятся все менее эффективными, делая их не очень масштабируемыми с точки зрения роста вашего XML. Push parsers – это счастливая среда, поскольку они позволяют вам контролировать разбор, тем самым устраняя любое сложное управление состоянием, поскольку состояние всегда известно, и они не страдают от раздувания памяти DOM-парсеров.

Это может быть причиной SAX рекомендуется для DOM: SAX функционирует как синтаксический анализатор XML. Кроме того, ознакомьтесь со статьей Википедии для SAX здесь .

EDIT: Чтобы конкретно определить размер, вам нужно будет взглянуть на вашу реализацию. Здесь приведен пример размера объекта DOM Document в памяти Java-анализатора на основе Java. Java, как и многие языки, определяет некоторые ограничения на основе памяти, такие как размер кучи JVM , а также веб-службы Android / XML DOM API также могут определять некоторые внутренние ограничения по усмотрению программистов (упомянутые здесь частично). Нет однозначного ответа относительно максимально допустимого размера.

Мой опыт позволяет мне сказать, что с использованием DOM используемая память составляет 2x размер файла, но, конечно, это всего лишь показатель. Если в дереве XML есть только одно поле, содержащее все данные, используемая память похожа на размер файла!