2012-01-17 2 views
1

У меня есть xml-файл с 3 частями данных на элемент: productName, productCode и productPrice. Количество элементов в XML-файле составляет около 7000.Как ускорить этот код выбора Linq?

Пользователь может найти продукт по названию, набрав «красную рубашку», например, в текстовом поле. Мой код делает эти задачи:

  1. разметить поиска текста и собирающие ProductName в том, что содержит все слова для поиска.

  2. порядок отбор по ProductCode

  3. выбрать только для отображения Productname и productPrice (не ProductCode, который используется только для OrderBy)

var products = from d in xElem.Descendants(fileName) 
         where textBox1.Text.ToLower().Split(' ').All(t => d.Element(productName).Value.ToLower().Contains(t)) 

         orderby d.Element(productCode).Value ascending 
         select new 
         { 
          Price = (double.Parse(d.Element(productPrice).Value)).ToString(numberFormat), 
          Name = d.Element(Name).Value 
         }; 

Где в этом коде являются узким местом (узлами)? И как их удалить? Я делаю этот Linq каждый раз, когда вводится нажатие клавиши в текстовом поле, что означает обновление результата в реальном времени (по сравнению с ожиданием клавиши Enter). Спасибо.

+0

Вы пробовали профилировать этот код? Каков был результат? – dasblinkenlight

+0

Это всегда будет медленно делать новый поиск при каждом нажатии клавиши, хотя Linq на XML, вероятно, медленнее, чем sql-запрос в индексированной таблице. Как ускорить Linq? Не используйте его. Все абстракции медленнее. – Sam

+0

Я никогда не делал профилирования. Я использую Visual Studio 2010. Будет проверять, доступна ли эта функция. – user763554

ответ

2

Без крепления профайлера и просмотра выходного сигнала я могу только догадываться, что происходит медленно.

  1. where textBox1.Text.ToLower.Split(' ') можно кэшировать вне запроса. Я сомневаюсь, что это серьезная проблема.

  2. LINQ to XML может быть медленным на очень больших XML-документах. Рассмотрите возможность использования XmlTextReader для быстрого (но уродливого) доступа к базовому XML в прямом режиме.

  3. Предварительно обрабатывать данные в памяти, если XML поддается этому. Запросы в памяти должны быть довольно быстрыми.

  4. Вы можете использовать что-то вроде Lucene.Net, чтобы индексировать большое количество XML-файлов для быстрого поиска. Это может быть излишним, но это довольно быстро и масштабируемо.

  5. Подумайте о проблеме немного больше. Каждый раз, когда пользователь нажимает клавишу, вы обрабатываете XML DOM и выполняете кучу строковых операций. Обработка XML таким образом, что у вас есть форма, более подходящая для вашей задачи, кажется хорошей победой.

Обратите внимание, что время отклика для автозаполнения этой природы является довольно слабым, вплоть до секунды лаг или так довольно приемлемо для большинства целей.