Как лучше всего использовать XPath с очень большими XML-файлами в.NET?

17
задан Jon Seigel 25 April 2010 в 04:23
поделиться

9 ответов

XPathReader является ответом. Это не часть времени выполнения C#, но это доступно для скачивания от Microsoft. Вот статья MSDN.

При построении XPathReader с XmlTextReader, Вы получаете эффективность потокового чтения с удобством выражений XPath.

Я не использовал его на измеренных файлах гигабайта, но я использовал его на файлах, которые являются десятками мегабайтов, которого является обычно достаточно для замедления, DOM основывал решения.

Заключение в кавычки от ниже: "XPathReader обеспечивает способность выполнить XPath по XML-документам способом потоковой передачи".

Загрузите с Microsoft

9
ответ дан 30 November 2019 в 14:01
поделиться

XML-файлы гигабайта! Я не завидую Вам эта задача.

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

я не попытался бы сделать все это в памяти путем чтения всего файла - если у Вас нет ОС на 64 бита и большой памяти. Что, если файл становится 2, 3, 4 ГБ?

Еще один подход мог быть должен читать в XML-файле и SAX использования, чтобы проанализировать файл и выписать меньшие XML-файлы согласно некоторому логическому разделению. Вы могли тогда обработать эти с XPath. Я использовал XPath на 20-30MB файлах, и это очень быстро. Я первоначально собирался использовать SAX, но думал, что дам XPath движение и был удивлен, насколько быстрый это было. Я сохранил много времени разработки, и вероятно только потерял 250 мс за запрос. Я использовал Java для своего парсинга, но я подозреваю, что было бы мало различия в.NET.

я действительно читал что XML:: Ветка (Perl модуль CPAN) была записана явно для обработки основанного на SAX парсинга XPath. Можно ли использовать различный язык?

Это могло бы также помочь https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-1044772.html

2
ответ дан 30 November 2019 в 14:01
поделиться

Вы уже обрисовали в общих чертах свой выбор.

Или необходимо отказаться от XPath и использовать XmlTextReader, или необходимо разбить документ в managable блоки, на которых можно использовать XPath.

при выборе последнего использования XPathDocument его ограничение только для чтения позволяет лучше используемый памяти.

1
ответ дан 30 November 2019 в 14:01
поделиться

Для выполнения запросов XPath со стандартными классами.NET, целое дерево документов должно быть загружено в памяти, которая не могла бы быть хорошей идеей, если может потребоваться до гигабайта. По моему скромному мнению, XmlReader является хорошим классом для того, чтобы справиться с такими задачами.

1
ответ дан 30 November 2019 в 14:01
поделиться

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

, Если это верно, прежде, чем начать разделять файл (который является в конечном счете правильным решением!) можно попытаться использовать сакс процессор XSLT/XQuery. Это имеет очень эффективное представление в оперативной памяти загруженного XML-документа ( "tinytree" модель ). Кроме того Saxon SA (shema-осведомленная версия, которая не является бесплатной) имеет некоторые расширения потоковой передачи . Читайте больше об этом здесь .

1
ответ дан 30 November 2019 в 14:01
поделиться

Как насчет того, чтобы просто читать все это в базу данных и затем работает с временной базой данных? Это могло бы быть лучше, потому что тогда Ваши запросы могут быть сделаны более эффективно с помощью TSQL.

1
ответ дан 30 November 2019 в 14:01
поделиться

Я думаю, что лучшее решение состоит в том, чтобы сделать Ваш собственный xml синтаксический анализатор, который может считать маленькие блоки не целый файл, или можно разделить большой файл на маленькие файлы и использовать dotnet классы с этими файлами. Проблема - Вы, не может проанализировать некоторые данные, пока целые данные не доступны, таким образом, я рекомендую использовать Ваш собственный синтаксический анализатор не dotnet классы

1
ответ дан 30 November 2019 в 14:01
поделиться

Вы пробовали XPathDocument? Этот класс оптимизирован для обработки запросов XPath эффективно.

, Если Вы не можете обработать свои входные документы эффективно с помощью XPathDocument, Вы могли бы рассмотреть предварительную обработку и/или разделение Ваших входных документов с помощью XmlReader.

0
ответ дан 30 November 2019 в 14:01
поделиться

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

Другой подход - использование Linq to XML с использованием таких элементов, как XElementStream. Надеюсь это поможет.

0
ответ дан 30 November 2019 в 14:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: