Фон
У нас есть проект, который был запущен в .NET 1.1, перемещен в .NET 2.0, а недавно снова перемещен в .NET 3.5. Проект чрезвычайно ориентирован на данные и использует XML для многих своих файлов данных. Некоторые из этих XML-файлов довольно велики, и я хотел бы воспользоваться возможностью, чтобы в настоящее время улучшить взаимодействие приложения с ними. Если возможно, я хочу избегать постоянного хранения их в памяти, но, с другой стороны, я хочу ускорить доступ к их данным.
Текущая настройка использует XmlDocument
и XPathDocument
(в зависимости от того, когда и кем она была написана). Данные просматриваются при первом запросе и кэшируются во внутренней структуре данных (а не в виде XML, который в большинстве сценариев занимал бы больше памяти). В прошлом это была хорошая модель, поскольку у нее было быстрое время доступа и низкий объем памяти (или, по крайней мере, удовлетворительный объем памяти). Однако теперь есть функция, которая запрашивает большую часть информации за один раз, а не красиво распределенные запросы, которые у нас были ранее. Это приводит к тому, что загрузка, проверка и синтаксический анализ XML становятся видимым узким местом в производительности.
Вопрос
Учитывая большой файл XML, каков наиболее эффективный и отзывчивый способ запроса его содержимого (например, «существует ли элемент A с id = B?») Повторно без наличия XML в памяти?
Обратите внимание, что сами данные могут находиться в памяти, но не в более раздутой форме XML, если мы можем помочь. В худшем случае мы могли бы принять один файл, загружаемый в память, для анализа, а затем снова выгружен на свободные ресурсы, но я бы хотел этого избежать, если это вообще возможно.
Учитывая, что мы уже кешируем данные там, где можем, этот вопрос можно также прочитать как «который быстрее и использует меньше памяти; XmlDocument
, XPathDocument
синтаксический анализ на основе XmlReader
или XDocument
/ LINQ-to-XML ? "
Редактировать: Еще проще, можем ли мы получить произвольный доступ к XML на диске без чтения всего файла сразу?
Пример
XML-файл содержит несколько записей:
<MyXml>
<Record id='1'/>
<Record id='2'/>
<Record id='3'/>
</MyXml>
Наш пользовательский интерфейс хочет знать, существует ли запись с идентификатором 3. Мы хотим выяснить, не нужно ли анализировать и загружать каждую запись в файле, если мы можем. Так что, если оно находится в нашем кеше, XML-взаимодействия нет, если нет, мы можем просто загрузить эту запись в кеш и ответить на запрос.
Цель
Чтобы иметь масштабируемый и быстрый способ запрашивать и кэшировать файлы данных XML, чтобы наш пользовательский интерфейс реагировал без использования нескольких потоков или долгосрочного хранения целых файлов XML в памяти.
Я понимаю, что где-то здесь может быть статья в блоге или MSDN, и я продолжу работу в Google после того, как опубликую этот вопрос, но если у кого-то есть данные, которые могут помочь, или примеры того, когда один из подходов лучше или быстрее, чем другой, это было бы здорово.
Обновление
Сегодня XMLTeam опубликовал блог , в котором содержатся отличные советы о том, когда использовать различные API-интерфейсы XML в .NET. Похоже, что-то на основе XmlReader
и IEnumerable
будет моим лучшим вариантом для сценария, который я привел здесь.