XPathReader является ответом. Это не часть времени выполнения C#, но это доступно для скачивания от Microsoft. Вот статья MSDN.
При построении XPathReader с XmlTextReader, Вы получаете эффективность потокового чтения с удобством выражений XPath.
Я не использовал его на измеренных файлах гигабайта, но я использовал его на файлах, которые являются десятками мегабайтов, которого является обычно достаточно для замедления, DOM основывал решения.
Заключение в кавычки от ниже: "XPathReader обеспечивает способность выполнить XPath по XML-документам способом потоковой передачи".
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
Вы уже обрисовали в общих чертах свой выбор.
Или необходимо отказаться от XPath и использовать XmlTextReader, или необходимо разбить документ в managable блоки, на которых можно использовать XPath.
при выборе последнего использования XPathDocument его ограничение только для чтения позволяет лучше используемый памяти.
Для выполнения запросов XPath со стандартными классами.NET, целое дерево документов должно быть загружено в памяти, которая не могла бы быть хорошей идеей, если может потребоваться до гигабайта. По моему скромному мнению, XmlReader является хорошим классом для того, чтобы справиться с такими задачами.
кажется, что Вы уже попытались использовать XPathDocument
и не могли разместить проанализированный xml документ в памяти .
, Если это верно, прежде, чем начать разделять файл (который является в конечном счете правильным решением!) можно попытаться использовать сакс процессор XSLT/XQuery. Это имеет очень эффективное представление в оперативной памяти загруженного XML-документа ( "tinytree" модель ). Кроме того Saxon SA (shema-осведомленная версия, которая не является бесплатной) имеет некоторые расширения потоковой передачи . Читайте больше об этом здесь .
Как насчет того, чтобы просто читать все это в базу данных и затем работает с временной базой данных? Это могло бы быть лучше, потому что тогда Ваши запросы могут быть сделаны более эффективно с помощью TSQL.
Я думаю, что лучшее решение состоит в том, чтобы сделать Ваш собственный xml синтаксический анализатор, который может считать маленькие блоки не целый файл, или можно разделить большой файл на маленькие файлы и использовать dotnet классы с этими файлами. Проблема - Вы, не может проанализировать некоторые данные, пока целые данные не доступны, таким образом, я рекомендую использовать Ваш собственный синтаксический анализатор не dotnet классы
Вы пробовали XPathDocument? Этот класс оптимизирован для обработки запросов XPath эффективно.
, Если Вы не можете обработать свои входные документы эффективно с помощью XPathDocument, Вы могли бы рассмотреть предварительную обработку и/или разделение Ваших входных документов с помощью XmlReader.
Поскольку в вашем случае размер данных может работать в гигабайтах, рассматривали ли вы возможность использования ADO.NET с XML в качестве базы данных. В дополнение к этому объем памяти не будет огромным.
Другой подход - использование Linq to XML с использованием таких элементов, как XElementStream. Надеюсь это поможет.