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

  • Автор темы Автор темы planeta
  • Дата начала Дата начала
Через стримридер пробовали?

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;
        }
    }
}
 
Остановку таймера выведи до 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 сек время выполнения, это круто, но нужно еще быстрее.. запросов просто будет очень много...
хотя есть многопоток, но не уверен, что он что то даст, ведь все зависит от скорости чтения, или я не правильно что то понимаю?
в строну БД нет смысла копать, будет дольше?
 
прости) Тогда ещё момент. Можешь отсортировать свой файл по возрастанию? Есть вероятность, что по отсортированному тот 1й код сработает быстрее
даже дольше стало(
 
запросов просто будет очень много...
Проверяйте все внутри одного стримридера... В любом случае упираться может в аппаратную часть, начиная с диска, лучший результат может показать NVMe, заканчивая оперативой и процессором.
 
Через стримридер пробовали?

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 сек
 
даже дольше стало(
ладно. Позже как освобожусь сам сгенерирую список и потестирую)

Твоя задача решаема 100% пи условии, что список никак не редактируется, а поиск направлен только на то, чтобы узнать, есть строка или нет
 
Проверяйте все внутри одного стримридера... В любом случае упираться может в аппаратную часть, начиная с диска, лучший результат может показать NVMe, заканчивая оперативой и процессором.
диск быстрее вряд ли получится сделать, он в ОЗУ уже... Оперативка ДДР4 3000мгц, проц 8 ядер Ryzen 2700
 
ладно. Позже как освобожусь сам сгенерирую список и потестирую)

Твоя задача решаема 100% пи условии, что список никак не редактируется, а поиск направлен только на то, чтобы узнать, есть строка или нет
я понимаю, но никак пока не найду это решение)
Буду очень признателен за помощь! Спасибо!
 
в строну БД нет смысла копать, будет дольше?
Дольше не будет, недавно зашел разговор:
Вообще по своей практики я более стабильной БД пока не замечал с MS Sql у меня проблем не было, а базы били под гиг 500 и выполнялись в секунды запросы, это на много быстрее чем работать с MySQl
 
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;

будет работать быстро, если список отсортирован
 
В общем быстрый поиск по паутине выдал такой совет по данной проблеме.
Люди советуют сделать второй файл и записать туда для каждой строки md5 хэш. при каждом изменении файла надо переиндексировать второй файл, ну или те данные что изменились.
поиск по хэшам намного быстрее. правда хэши могут совпадать, но это решается простой до проверкой исходной строки. Решение не простое, но пишут что поиск по такому методу позволяет обрабатывать 100кк строк за миллисекунды.
 
В общем быстрый поиск по паутине выдал такой совет по данной проблеме.
Люди советуют сделать второй файл и записать туда для каждой строки md5 хэш. при каждом изменении файла надо переиндексировать второй файл, ну или те данные что изменились.
поиск по хэшам намного быстрее. правда хэши могут совпадать, но это решается простой до проверкой исходной строки. Решение не простое, но пишут что поиск по такому методу позволяет обрабатывать 100кк строк за миллисекунды.
Строки не меняются, файл всегда один, не совсем понимаю как это поможет в решении вопроса.. даже если он статичный, не понятно как сгенерить мд5 хэши и как потом по ним быстро искать зенкой и чем они от обычного текста отличаются...
Объясните пожалуйста.
 
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', хотя и исполняется.
 
Строки не меняются, файл всегда один, не совсем понимаю как это поможет в решении вопроса.. даже если он статичный, не понятно как сгенерить мд5 хэши и как потом по ним быстро искать зенкой и чем они от обычного текста отличаются...
Объясните пожалуйста.
ну суть в том что хэши занимают меньше места. и размер файла уменьшается, ну и там рекомендуют запихать этот файл в базу, проиндексировать его дополнительно и дополнительно настроить таблицу на постоянное нахождение в памяти. ну решению имеет быть место, но оно реально сложное.
 
ну суть в том что хэши занимают меньше места. и размер файла уменьшается, ну и там рекомендуют запихать этот файл в базу, проиндексировать его дополнительно и дополнительно настроить таблицу на постоянное нахождение в памяти. ну решению имеет быть место, но оно реально сложное.
Сейчас посчитал, в строках моего файла в среднем 34-35 символов, в md5 - 32 символа, так что размер файла уменьшится совсем незначительно.
можно ссылку откуда инфа? тоже думаю про переход на БД, возможно это решит вопрос, но по быстрым MSQL я так и не нашел инструкций по подключению к зенке...
 
Сейчас посчитал, в строках моего файла в среднем 34-35 символов, в md5 - 32 символа, так что размер файла уменьшится совсем незначительно.
можно ссылку откуда инфа? тоже думаю про переход на БД, возможно это решит вопрос, но по быстрым MSQL я так и не нашел инструкций по подключению к зенке...
здесь читал https://www.cyberforum.ru/csharp-net/thread1937510.html
 
  • Спасибо
Реакции: planeta

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