2011-04-21 3 views
1

Я пишу процесс для веб-сайта ASP.NET, который будет искать определенное значение из файла XML и выполнять перенаправление. Я использую LINQ (C#) для анализа этого XML.Проанализируйте меньший XML несколько раз или более крупный XML, используя LINQ to XML.

Я попал в точку принятия решения, где мне нужно искать альтернативные значения в рамках одного запроса. У меня есть два решения:

  1. Посмотрите каждое значение отдельно. Это будет означать разбор XML в два раза. Но размер XML будет намного меньше

  2. Храните несколько значений в XML и разберите XML один раз. Это сделает XML больше.

Итак, какой подход будет иметь меньшие эксплуатационные издержки, учитывая это для веб-сайта с некоторым параллелизмом?

Проще говоря, должен ли я разобрать 200 элементов один раз или 100 элементов дважды?

+0

BTW XML-строка уже кэширована в объекте Cache. – dotnetster

+0

Покажите нам запросы linq. Я расскажу вам, как кэшировать полный набор результатов вместо строки XML :) – sehe

+0

Я не могу кэшировать результирующий набор, поскольку он может быть различным для каждого запроса. На самом деле я кешу самого XElement. – dotnetster

ответ

0

Хорошо, я получил результаты для обоих сценариев через мой запрос Linq, а затем перешел через два XElements, чтобы определить, какой из них мне нужно использовать. Мне просто нужно было подумать немного больше. Итак, теперь у меня гораздо меньше XML и один просмотр.

 IEnumerable<XElement> mping = (from mpings in mpingXML.Elements("mping") 
              where mpings.Element("sptrn").Value.Equals(sourceURL, StringComparison.InvariantCultureIgnoreCase) 
              && (mpings.Attribute("lcl").Value.Equals(locale, StringComparison.InvariantCultureIgnoreCase) || mpings.Attribute("lcl").Value.Equals("ALL", StringComparison.InvariantCultureIgnoreCase)) 
              select mpings); 
2

Ни то, ни другое. Кэш анализируемого результата, пока он не будет изменен (если вообще).

+0

Я кэширую весь XML. Но синтаксический анализ результата запроса Linq невозможен, поскольку каждый запрос даст потенциально другой набор результатов. – dotnetster

+0

Ну, вам приложение нужно что-то сделать. Если LINQ to XML недостаточно хорош, просто загрузите данные из представления XML в некоторую лучшую структуру данных. Вы не показывали структуру, поэтому трудно рекомендовать что-то более конкретное. –

1

Почему бы не разобрать его в памяти один раз, а затем выполнить поиск в памяти? Например. прочитайте его в словаре <> на свой объект приложения. Поместите файл FilesystemWatcher в файл и повторите анализ, если он изменится.

+0

XML уже находится в памяти. Я пытаюсь оптимизировать еще больше. Отсюда мой вопрос о размере по сравнению с двумя взглядами. – dotnetster

0

Мои $ 0,02:

кэширование XElement (и неоднократно запроса), что является достаточно хорошим, пока ваш профайлер говорит вам иначе.

+0

Согласен. Сейчас XML составляет около 40-50 КБ. – dotnetster

Смежные вопросы