#c# #.net #linq-to-xml
#c# #.net #linq-to-xml
Вопрос:
Я пишу процесс для ASP.NET веб-сайт, который будет искать определенное значение из XML-файла и выполнять перенаправление. Я использую LINQ (C #) для анализа этого XML.
Я достиг точки принятия решения, когда мне нужно искать альтернативные значения в одном запросе. У меня есть два решения:
-
Найдите каждое значение отдельно. Это будет означать повторный анализ XML. Но размер XML будет намного меньше
-
Сохраните несколько значений в 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);