Наша программа в настоящее время использует 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, что уже очень помогло бы.
Я придерживаюсь этого подхода, если обработка редкая (нужен только элемент здесь и там), xmlReader лучше, если вам нужно обработать все элементы, лучше SAX. Хотя может возникнуть мнение, хотите ли вы подтолкнуть обработку или вы хотите, чтобы обработка подтолкнула ваш код …
Если вам нужно обрабатывать большие XML-документы, размер становится основным фактором. Как вы видели с 20MB -> 100MB для анализа DOM, если вы получаете намного больше, чем это, это может быть слишком дорого, и SAX может быть единственным способом его обработки. Для встроенных устройств или устройств с ограниченным объемом памяти SAX может потребоваться даже для небольших файлов.
Если вы хотите начать синтаксический анализ до того, как файл будет завершен, SAX — это путь. Если вы пишете браузер, транслируете XML или требуете оперативности, то вам нужно будет использовать SAX.
SAX — большая боль, если вы можете избежать анализа DOM, который обычно приводит к сокращению кода и упрощению кода, для более простых запросов DOM вы можете избежать конечного автомата, например. Если вы заботитесь только о нескольких полях в документе, вы можете даже не запрашивать анализатор DOM напрямую и вместо этого запрашивать XSLT.