Самый быстрый способ найти текст в файле - PullRequest
0 голосов
/ 04 августа 2020

Итак, я ищу способ эффективного поиска текста в файле. Сейчас я использую это:

using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read, 1024 * 1024, FileOptions.SequentialScan))
using (StreamReader streamReader = new StreamReader(fileStream))
{
    string line;
    while ((line = streamReader.ReadLine()) != null)
    {
        int index = 0;
        while ((index = line.IndexOf(searchText, index, StringComparison.Ordinal)) != -1)
        {
            index += searchText.Length;
        }
    }
}

Однако мне было интересно, есть ли способ более эффективного поиска в файле. Я думал о поиске текста в буферах, но не знаю, как это сделать. Спасибо.

EDIT: без вызова IndexOf я получаю около 1600 мс. С индексом это около 7400 мс.

EDIT: у меня есть базовая c реализация чтения фрагментов, и время у меня уменьшилось до 740 мс. (Нет строк для чтения) У него еще много работы, но я в основном читаю фрагмент за раз и беру индекс.

1 Ответ

1 голос
/ 04 августа 2020

Ваш подход с точки зрения производительности будет O (xl) время, где x - длина искомой строки, а l - длина строки, которую вы пытаетесь найти. Вы можете применить несколько общих алгоритмов:

  • Бойер-Мур
  • Моррис-Пратт
  • Кнут-Моррис-Пратт

Я рекомендую вам использовать Boyer-Moore, и здесь у вас есть примеры того, как это реализовать: https://www.geeksforgeeks.org/boyer-moore-algorithm-for-pattern-searching/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...