В зависимости от ho w много раз вы хотите сделать «поиск», вы хотите использовать поисковую систему или нет. Если вы хотите много раз искать, используйте поисковую систему, иначе: нет. Я расскажу, как реализовать оба сценария здесь.
При использовании поисковой системы: похоже, что вы ищете подстроки, а это значит, что вы должны индексировать свои файлы как таковые, используя свою любимую поисковую систему, предпочтительно такую, которую вы можете настроить (lucene, terrier и т. Д.). Техника, в которой вы нуждаетесь, - это индексирование триграмм, то есть: все 3-значные комбинации должны быть проиндексированы. F.ex .: «foobar» будет генерировать «foo», «oob», «oba» и «bar». При поиске вы хотите сделать то же самое с вашим запросом и выдать запрос поисковой системы с И всех этих триграмм. (Это приведет к объединению в списках проводки из документов, которые вернут их идентификаторы или все, что вы разместите в списках проводки).
В качестве альтернативы вы можете реализовать массивы суффиксов и индексировать свои файлы один раз. Это даст немного большую гибкость, если вы хотите найти короткие (1-2 символа) подстроки, но с точки зрения индексов сложнее поддерживать. (Есть несколько исследований в CWI/Amsterdam для быстрых индексирующих массивов суффикса)
Если вы хотите искать только несколько раз, то использовать алгоритм Boyer-Moore (я обычно использую Boyer-moore-sunday, как описано в [Graham A. Stephen, String Search]) или скомпилированный DFA (вы можете создать их из NFA, что проще сделать). Тем не менее, это только даст вам небольшое увеличение скорости по той простой причине, что диск IO, вероятно, является вашим узким местом и сравнивает кучу байтов, которые нужно декодировать в любом случае, довольно быстро.
Самое большое улучшение, которое вы можете сделать, это не чтение вашего файла по строкам, а в блоках. Вы должны настроить NTFS на использование размера блока в 64 КБ, если сможете, и читать файлы в размножении 64 КБ - считайте 4 МБ или более в одном чтении. Я бы даже предложил использовать асинхронный ввод-вывод, чтобы вы могли одновременно читать и обрабатывать (ранее прочитанные данные). Если вы сделаете это правильно, это уже должно дать вам реализацию с разделенной секунды для 10 МБ на большинстве современных аппаратных средств.
И последнее, но не менее важное: аккуратный трюк, используемый для получения информации, также предназначен для сжатия ваших данных с использованием алгоритма быстрого сжатия. Поскольку диск IO медленнее операций с памятью/процессором, это, вероятно, также поможет. Компрессор Snappy от Google - хороший пример быстрого алгоритма сжатия.
Ваше замедление, вероятно, происходит от чтения файлов по строкам. Прочитайте файл сразу в памяти и выполните поиск. – dda
http://stackoverflow.com/questions/4289353/fastest-way-to-search-ascii-files-in-c-sharp-for-simple-keywords – Ofiris
Вам нужно выполнить поиск по тем же файлам несколько раз? – user626528