Помогите с логикой быстрого поиска в списке

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93
Через стримридер пробовали?

C#:
string path = @"C:\words.txt";
string word = "Zwinglianist";
bool result = false;

using (FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (BufferedStream bs = new BufferedStream(fs))
using (StreamReader sr = new StreamReader(bs))
{
    string line;
    while ((line = sr.ReadLine()) != null)
    {
        if (line.Contains(word)) {
            result = true;
            break;
        }
    }
}
 

planeta

Client
Регистрация
01.09.2015
Сообщения
118
Благодарностей
48
Баллы
28
Остановку таймера выведи до return status;
C#:
var timer = System.Diagnostics.Stopwatch.StartNew();

string textContains = project.Variables["id"].Value;
string status = "no";
IZennoList sourceList = project.Lists["spisok"];
Parallel.ForEach<string>(sourceList, el => {
    if (el == textContains){
    status = "yes";
    }
});

timer.Stop();
var ts = TimeSpan.FromSeconds(timer.ElapsedMilliseconds/1000);
project.SendInfoToLog(string.Format("Время выполнения проекта: {0} д. {1} ч. {2} мин. {3} сек.", ts.Days, ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds), true);

return status;
2 сек время выполнения, это круто, но нужно еще быстрее.. запросов просто будет очень много...
хотя есть многопоток, но не уверен, что он что то даст, ведь все зависит от скорости чтения, или я не правильно что то понимаю?
в строну БД нет смысла копать, будет дольше?
 

planeta

Client
Регистрация
01.09.2015
Сообщения
118
Благодарностей
48
Баллы
28

planeta

Client
Регистрация
01.09.2015
Сообщения
118
Благодарностей
48
Баллы
28
прости) Тогда ещё момент. Можешь отсортировать свой файл по возрастанию? Есть вероятность, что по отсортированному тот 1й код сработает быстрее
даже дольше стало(
 

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93
запросов просто будет очень много...
Проверяйте все внутри одного стримридера... В любом случае упираться может в аппаратную часть, начиная с диска, лучший результат может показать NVMe, заканчивая оперативой и процессором.
 

planeta

Client
Регистрация
01.09.2015
Сообщения
118
Благодарностей
48
Баллы
28
Через стримридер пробовали?

C#:
string path = @"C:\words.txt";
string word = "Zwinglianist";
bool result = false;

using (FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (BufferedStream bs = new BufferedStream(fs))
using (StreamReader sr = new StreamReader(bs))
{
    string line;
    while ((line = sr.ReadLine()) != null)
    {
        if (line.Contains(word)) {
            result = true;
            break;
        }
    }
}
Спасибо.
занимает около 10 сек
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
даже дольше стало(
ладно. Позже как освобожусь сам сгенерирую список и потестирую)

Твоя задача решаема 100% пи условии, что список никак не редактируется, а поиск направлен только на то, чтобы узнать, есть строка или нет
 

planeta

Client
Регистрация
01.09.2015
Сообщения
118
Благодарностей
48
Баллы
28
Проверяйте все внутри одного стримридера... В любом случае упираться может в аппаратную часть, начиная с диска, лучший результат может показать NVMe, заканчивая оперативой и процессором.
диск быстрее вряд ли получится сделать, он в ОЗУ уже... Оперативка ДДР4 3000мгц, проц 8 ядер Ryzen 2700
 

planeta

Client
Регистрация
01.09.2015
Сообщения
118
Благодарностей
48
Баллы
28
ладно. Позже как освобожусь сам сгенерирую список и потестирую)

Твоя задача решаема 100% пи условии, что список никак не редактируется, а поиск направлен только на то, чтобы узнать, есть строка или нет
я понимаю, но никак пока не найду это решение)
Буду очень признателен за помощь! Спасибо!
 

Koqpe

Client
Регистрация
23.12.2014
Сообщения
1 100
Благодарностей
649
Баллы
113
в строну БД нет смысла копать, будет дольше?
Дольше не будет, недавно зашел разговор:
Вообще по своей практики я более стабильной БД пока не замечал с MS Sql у меня проблем не было, а базы били под гиг 500 и выполнялись в секунды запросы, это на много быстрее чем работать с MySQl
 

planeta

Client
Регистрация
01.09.2015
Сообщения
118
Благодарностей
48
Баллы
28

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
C#:
string textContains = project.Variables["id"].Value;
var list = project.Lists["spisok"];

int min = 0;
int max = list.Count - 1;
while (min <= max)
{
    int index = (min + max) / 2;
    int x =  textContains.CompareTo(list[index]);
    
    if (x == 0) return true;//index;
    else if (x > 0) min = index + 1;
    else max = index - 1;
}

return false;
будет работать быстро, если список отсортирован
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
В общем быстрый поиск по паутине выдал такой совет по данной проблеме.
Люди советуют сделать второй файл и записать туда для каждой строки md5 хэш. при каждом изменении файла надо переиндексировать второй файл, ну или те данные что изменились.
поиск по хэшам намного быстрее. правда хэши могут совпадать, но это решается простой до проверкой исходной строки. Решение не простое, но пишут что поиск по такому методу позволяет обрабатывать 100кк строк за миллисекунды.
 

planeta

Client
Регистрация
01.09.2015
Сообщения
118
Благодарностей
48
Баллы
28
В общем быстрый поиск по паутине выдал такой совет по данной проблеме.
Люди советуют сделать второй файл и записать туда для каждой строки md5 хэш. при каждом изменении файла надо переиндексировать второй файл, ну или те данные что изменились.
поиск по хэшам намного быстрее. правда хэши могут совпадать, но это решается простой до проверкой исходной строки. Решение не простое, но пишут что поиск по такому методу позволяет обрабатывать 100кк строк за миллисекунды.
Строки не меняются, файл всегда один, не совсем понимаю как это поможет в решении вопроса.. даже если он статичный, не понятно как сгенерить мд5 хэши и как потом по ним быстро искать зенкой и чем они от обычного текста отличаются...
Объясните пожалуйста.
 

planeta

Client
Регистрация
01.09.2015
Сообщения
118
Благодарностей
48
Баллы
28
C#:
string textContains = project.Variables["id"].Value;
var list = project.Lists["spisok"];

int min = 0;
int max = list.Count - 1;
while (min <= max)
{
    int index = (min + max) / 2;
    int x =  textContains.CompareTo(list[index]);
   
    if (x == 0) return true;//index;
    else if (x > 0) min = index + 1;
    else max = index - 1;
}

return false;
будет работать быстро, если список отсортирован
код постоянно выдает "False', хотя и исполняется.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Строки не меняются, файл всегда один, не совсем понимаю как это поможет в решении вопроса.. даже если он статичный, не понятно как сгенерить мд5 хэши и как потом по ним быстро искать зенкой и чем они от обычного текста отличаются...
Объясните пожалуйста.
ну суть в том что хэши занимают меньше места. и размер файла уменьшается, ну и там рекомендуют запихать этот файл в базу, проиндексировать его дополнительно и дополнительно настроить таблицу на постоянное нахождение в памяти. ну решению имеет быть место, но оно реально сложное.
 

planeta

Client
Регистрация
01.09.2015
Сообщения
118
Благодарностей
48
Баллы
28
ну суть в том что хэши занимают меньше места. и размер файла уменьшается, ну и там рекомендуют запихать этот файл в базу, проиндексировать его дополнительно и дополнительно настроить таблицу на постоянное нахождение в памяти. ну решению имеет быть место, но оно реально сложное.
Сейчас посчитал, в строках моего файла в среднем 34-35 символов, в md5 - 32 символа, так что размер файла уменьшится совсем незначительно.
можно ссылку откуда инфа? тоже думаю про переход на БД, возможно это решит вопрос, но по быстрым MSQL я так и не нашел инструкций по подключению к зенке...
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Сейчас посчитал, в строках моего файла в среднем 34-35 символов, в md5 - 32 символа, так что размер файла уменьшится совсем незначительно.
можно ссылку откуда инфа? тоже думаю про переход на БД, возможно это решит вопрос, но по быстрым MSQL я так и не нашел инструкций по подключению к зенке...
здесь читал https://www.cyberforum.ru/csharp-net/thread1937510.html
 
  • Спасибо
Реакции: planeta

planeta

Client
Регистрация
01.09.2015
Сообщения
118
Благодарностей
48
Баллы
28

planeta

Client
Регистрация
01.09.2015
Сообщения
118
Благодарностей
48
Баллы
28

biryukovm

Client
Регистрация
19.05.2019
Сообщения
147
Благодарностей
10
Баллы
18

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)