Максимально быстрая обработка XML в Delphi для очень больших документов

StackOverflow https://stackoverflow.com/questions/264020

Вопрос

Мне нужны рекомендации о том, что использовать в Delphi (я использую Delphi 2009) для обработки очень больших XML-файлов (например100 МБ) как можно быстрее.

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

Будем надеяться, что ввод и вывод могут быть выполнены в течение нескольких секунд на быстродействующем компьютере с Windows.


Разъяснение.Я ожидаю, что мне нужно будет использовать DOM, потому что доступ к структуре данных для разработки отчетов и внесения обновлений в данные важен, и мне нужно, чтобы эта функциональность была очень быстрой.

Ввод выполняется только один раз для загрузки файла, а вывод выполняется только для сохранения файла, обычно только один раз при выходе.Они также должны быть быстрыми, но не так важны, как доступ к данным в памяти и их обновление.

Насколько я понимаю, сторонние анализаторы помогают только с вводом и выводом, но не с использованием и изменением данных после загрузки в память.Или я ошибаюсь в этом?

Это было полезно?

Решение

Если я правильно понял ваш вопрос, вам известна структура данных, и вы изменяете данные, а не XML-структуру файла.

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

Считайте из потока, используйте какой-нибудь алгоритм быстрого текстового поиска, например Бойер-Мур, чтобы найти места, где вам нужно изменить данные, выполните свою модификацию и выведите данные в другой поток.

Это было бы за один проход, без синтаксического анализа XML, без построения XML-дерева в памяти.

Другие советы

SAX стоит рассмотреть вместо DOM-парсера.

С DOM вы оплачиваете накладные расходы на загрузку документа, но после загрузки к данным можно быстро получить доступ и обновить их.

С SAX вам приходится писать обработчики для begin-element, end-element и т.д., Но у вас гораздо больше гибкости в том, что вы делаете по ходу дела.

Хотя это, вероятно, не поможет вашей ситуации, SAX очень полезен при поиске, потому что вы можете остановить синтаксический анализ в любой момент, поэтому, как только вы нашли то, что хотели, вы можете остановиться.

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

Как бы то ни было, я обычно использую анализаторы MSXML DOM и SAX.Можно утверждать, что они работают не с лучшей стороны, я утверждаю, что, вероятно, все больше людей работают над их улучшением, поэтому они будут становиться все лучше и лучше.

Я очень доволен NativeXML ( Родной ) от SimDesign.Он также включает в себя специальную версию под названием FastXML, которую я еще не тестировал, но говорят, что она, ну, быстрая.

Возможно, вы захотите взглянуть на Компонент DIHtmlParser, вдохновленный Delphi.Предполагается, что это "чрезвычайно быстро, особенно при разборе огромных файлов", и "на современных машинах скорость обработки HTML-данных превышает 15 МБ в секунду".У меня было несколько довольно хороших опытов с этим, хотя я никогда не пробовал это с огромными файлами.

Я не специалист, но я полагаю, что все сходятся во мнении, что синтаксический анализатор SAX будет намного эффективнее, чем DOM...

Если вы когда-нибудь рассматривали способ SAX, управляемый событиями, Библиотека синтаксического анализатора XML может оказаться весьма кстати.

Другая возможность, которую я только что обнаружил, заключается в Упаковка LMD ElPack которые я приобрел, они включают библиотеку поддержки XML, которая, по их словам, "чрезвычайно быстра, полностью поддерживает unicode и добавляет лишь небольшой объем вашим Exe-файлам".

Глядя на исходный код их модуля LMDXML.pas, включенного в пакет LMD 7 (для Delphi 2009), он говорит, что код основан на коде SimpleXML версии 8.0 (июль 2006) Михаила Власова.

Если вам нужна только прямая манипуляция, я бы согласился с ответом зендара.

Что касается реализации DOM или SAX, я бы рекомендовал DIXml.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top