Быстрый поиск в C#
От: ralnikov  
Дата: 23.05.02 11:07
Оценка:
Здравствуйте.
Как лучше реализовать поиск подстроки в большом массиве строк, который берётся из MSSQL?
Пока не нашёл ничего лучшего, как спользовать ArrayList...
Re: Быстрый поиск в C#
От: Aeneas Россия  
Дата: 23.05.02 11:29
Оценка:
Здравствуйте ralnikov, Вы писали:

А что? Из MSSQL нельзя возвращать уже результаты поиска той самой подстроки?
Быстрее же будет
Re: Быстрый поиск в C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.05.02 12:53
Оценка:
Здравствуйте 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 и не могу придумать лучшего решения :(
Re[3]: Быстрый поиск в C#
От: Roman Avramov  
Дата: 24.05.02 05:32
Оценка:
Такой вариант: сделай DataTable, заполни ее, сделай для нее DataView и отбирай нужное через RowFilter
Re[3]: Быстрый поиск в C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.05.02 17:16
Оценка:
Здравствуйте Аноним, Вы писали:

А>Искать 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 в своё время. Однако, необходим не полнгтекстовый поиск, а специализированный поиск по вхождениям, похожести и т.д. Прихожу к мысли о самопальном индексировании :))
Re[3]: Быстрый поиск в C#
От: V.Petrovski Беларусь  
Дата: 26.05.02 13:40
Оценка:
Здравствуйте Аноним,

В .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. Удачи.
Re[5]: Быстрый поиск в C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.05.02 15:03
Оценка:
Здравствуйте Аноним, Вы писали:

А>Да, пользовал Index Server в своё время. Однако, необходим не полнгтекстовый поиск, а специализированный поиск по вхождениям, похожести и т.д. Прихожу к мысли о самопальном индексировании


Ну, если алгоритмы и в правду уникальны, то кроме как писать свою систему индексации ты ничего путного не придумаешь. При этом, кстати, хранение данных в SQL-сервере будет излишним.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.