Многократно анализировать XML меньшего размера или один раз XML большего размера с помощью LINQ to XML

#c# #.net #linq-to-xml

#c# #.net #linq-to-xml

Вопрос:

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

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

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

  2. Сохраните несколько значений в XML и проанализируйте XML один раз. Это увеличит размер XML.

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

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

Комментарии:

1. Кстати, строка XML уже кэширована в объекте Cache.

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

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

Ответ №1:

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

Комментарии:

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

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

Ответ №2:

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

Комментарии:

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

Ответ №3:

Мои $ 0.02:

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

Ответ №4:

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

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