Какой API libxml2 я должен использовать для больших файлов?

Наша программа в настоящее время использует libxml2 DOM API (xmlReadFile) загрузить весь файл в память. К сожалению, это разбивает на «большие» XML-файлы, так как базовое потребление памяти в libxml2 DOM примерно в 4-5 раз превышает базовый размер файла.

Кажется, libxml2 предлагает два API для чтения XML, когда я не хочу хранить все дерево в памяти: SAX2 а также XMLReader.

Я еще не копался в API, но мне интересно, какой из них предпочтительнее при каких обстоятельствах?

Примечание. Все, что мне нужно сделать с файлом XML, — это заполнить некоторые структуры данных C ++ данными, найденными в файле XML. И они, в свою очередь, будут намного меньше, чем (очень подробное) определение XML. На данный момент, с xmlReadFile и DOM API — процесс занимает около 100 МБ памяти для 20 МБ XML-файла. Данные C ++ в памяти для такого файла больше похожи на 5 МБ, поэтому я мог бы перейти от 1: 4 до 4: 1, что уже очень помогло бы.

0

Решение

Я придерживаюсь этого подхода, если обработка редкая (нужен только элемент здесь и там), xmlReader лучше, если вам нужно обработать все элементы, лучше SAX. Хотя может возникнуть мнение, хотите ли вы подтолкнуть обработку или вы хотите, чтобы обработка подтолкнула ваш код …

1

Другие решения

  • Если вам нужно обрабатывать большие XML-документы, размер становится основным фактором. Как вы видели с 20MB -> 100MB для анализа DOM, если вы получаете намного больше, чем это, это может быть слишком дорого, и SAX может быть единственным способом его обработки. Для встроенных устройств или устройств с ограниченным объемом памяти SAX может потребоваться даже для небольших файлов.

  • Если вы хотите начать синтаксический анализ до того, как файл будет завершен, SAX — это путь. Если вы пишете браузер, транслируете XML или требуете оперативности, то вам нужно будет использовать SAX.

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

0

По вопросам рекламы [email protected]