Здравствуйте.
Как лучше реализовать поиск подстроки в большом массиве строк, который берётся из MSSQL?
Пока не нашёл ничего лучшего, как спользовать ArrayList...
Здравствуйте ralnikov, Вы писали:
R>Здравствуйте. R>Как лучше реализовать поиск подстроки в большом массиве строк, который берётся из MSSQL? R>Пока не нашёл ничего лучшего, как спользовать ArrayList...
Ты задачу опиши. А то поиск подстрок в массиве это слишком обстрактно.
К тому же, не понятно почему не выбирать нужные строки прямо на SQL-сервере?.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Быстрый поиск в C#
От:
Аноним
Дата:
23.05.02 13:25
Оценка:
Искать charindex'ом через SQL не кульно по следующим мотивам: требуется обеспечить хотя бы 50-80 поисков в секунду. SQL Server такую производительность НЕ обеспечивает, к тому же возможны блокировки таблицы и простои по этой причине. Плюс необходимо одновременно учитывать и другие параметры записи.
Мой прототип на Delphi грузит данные в массив записей и ищет по ним со скоростью до 150 запросов в секунду для массива в 250 тысяч строк.
на C# я сделал так:
читаю данные в ArrayList:
SqlConnection Conn = new SqlConnection();
Conn.ConnectionString = Utils.ConnStr;
SqlCommand Cmd = new SqlCommand("SELECT word, cat, c FROM dealtime ORDER BY word ASC", Conn);
Conn.Open();
SqlDataReader Read = Cmd.ExecuteReader ();
isd = new isData(); // Класс со свойством Data — ArrayList
ds = 0;
while (Read.Read())
{
isd.Data.Add(Read[0]);
isd.Data.Add(Read[1]);
isd.Data.Add(Read[2]);
ds++;
}
А вот и сам isData с методом для поиска:
public class isData
{
const int ArraySize = 3;
public ArrayList Data;
public isData()
{
Data = new ArrayList();
}
public ArrayList Search(string Context)
{
int i;
int ds;
int f = 0;
string s;
ArrayList ar = new ArrayList();
ds = (Data.Count / ArraySize)-1;
for (i = 0; i<= ds; i++)
{
s = Data[i*ArraySize].ToString();
if (s.IndexOf(Context) != -1)
{
ar.Add(s);
f++;
}
}
Utils.Debug("Found "+f.ToString()+" entries");
return ar;
}
}
Сдаётся мне, сделано очень неэффективно, но как сделать лучше? Я пока слаб в методологии .NET и не могу придумать лучшего решения :(
Здравствуйте Аноним, Вы писали:
А>Искать charindex'ом через SQL не кульно по следующим мотивам: требуется обеспечить хотя бы 50-80 поисков в секунду. SQL Server такую производительность НЕ обеспечивает, к тому же возможны блокировки таблицы и простои по этой причине. Плюс необходимо одновременно учитывать и другие параметры записи.
Ты чего нибудь о MS Indexing сервере и о его интеграции с MSSQLServer слышал?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Быстрый поиск в C#
От:
Аноним
Дата:
26.05.02 09:17
Оценка:
Здравствуйте VladD2, Вы писали:
VD>Здравствуйте Аноним, Вы писали:
А>>Искать charindex'ом через SQL не кульно по следующим мотивам: требуется обеспечить хотя бы 50-80 поисков в секунду. SQL Server такую производительность НЕ обеспечивает, к тому же возможны блокировки таблицы и простои по этой причине. Плюс необходимо одновременно учитывать и другие параметры записи.
VD>Ты чего нибудь о MS Indexing сервере и о его интеграции с MSSQLServer слышал?
Да, пользовал Index Server в своё время. Однако, необходим не полнгтекстовый поиск, а специализированный поиск по вхождениям, похожести и т.д. Прихожу к мысли о самопальном индексировании :))
В .NET есть понятие DataSet — это XML. Тобишь выбирая строки из базы ты его записываешь в DataSet, а потом уже в этом DataSet выбираешь подстроки. Это решение напоминает выгрузку таблиц(ы) в память и получение выборок уже из таблиц(ы) в памяти. Сразу скажу количество вхождений и того подобное получать из XML напного быстрее чем бегать по массиву.
вот как можно написать:
SqlConnection connection = new SqlConnection(...);
SqlCommand selectCommand = new SqlCommand(connection,"...");
SqlDataAdapter adapter = new SqlDataAdapter(selectCommand);
DataSet dataSet = new DataSet("Data");
dataSet.Tables.Add("Strings");
adapter.Fill(dataSet,"Strings");
......
а теперь можно работать с DataSet без обращений к БД.
Поиск строк которые начинаются с 1 и отсортировать результат
DataTable strings = dataSet.Tables["Strings"];
DataRow[] result = strings.Select("Name LIKE '1%'","Name ASC");
Вот и вся история. Попробуй, Думаю это тебе будет и интересно и полезно. Да и скорость я думаю тебя устроит.
А вот еще — ты заметил что я юзаю SqlCommand — при работе с MS SQL Sever System.Data.SqlClient работает на 20-25 % ,быстрее чем OlqDbClient. Удачи.
Здравствуйте Аноним, Вы писали:
А>Да, пользовал Index Server в своё время. Однако, необходим не полнгтекстовый поиск, а специализированный поиск по вхождениям, похожести и т.д. Прихожу к мысли о самопальном индексировании
Ну, если алгоритмы и в правду уникальны, то кроме как писать свою систему индексации ты ничего путного не придумаешь. При этом, кстати, хранение данных в SQL-сервере будет излишним.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.