Максимально возможная обработка XML в Delphi для очень больших документов - PullRequest
8 голосов
/ 05 ноября 2008

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

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

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


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

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

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

Ответы [ 8 ]

8 голосов
/ 05 ноября 2008

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

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

Чтение из потока, использование некоторого алгоритма быстрого текстового поиска, например Boyer-Moore , чтобы найти места, где вам нужно изменить данные, выполнить ваши изменения и вывести данные в другой поток.

Это будет однопроходный, без разбора XML, без построения дерева XML в памяти.

5 голосов
/ 05 ноября 2008

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

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

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

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

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

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

4 голосов
/ 05 ноября 2008

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

3 голосов
/ 05 ноября 2008

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

2 голосов
/ 05 ноября 2008

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

1 голос
/ 06 ноября 2008

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

0 голосов
/ 08 мая 2009

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

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

0 голосов
/ 07 ноября 2008

Еще одна возможность, которую я только что обнаружил, - это приобретенный мной пакет LMD ElPack , который включает в себя библиотеку поддержки XML, которая, по их словам, «чрезвычайно быстрая, полностью поддерживает Unicode и добавляет лишь небольшую площадь для ваши exe-файлы ".

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

...