Вот проблема, с которой я столкнулся: у меня есть набор журналов, которые могут расти довольно быстро. Каждый день они разбиваются на отдельные файлы, и размер файлов может легко увеличиться до гигабайта. Чтобы уменьшить размер, записи старше 30 дней удаляются.
Проблема в том, что я хочу найти в этих файлах определенную строку. Прямо сейчас поиск Бойера-Мура идет невероятно медленно. Я знаю, что такие приложения, как dtSearch, могут обеспечить действительно быстрый поиск с помощью индексации, но я не совсем уверен, как это реализовать, не занимая вдвое больше места, которое уже занимает журнал.
Есть ли какие-нибудь ресурсы, которые могут мне помочь? Я действительно ищу стандартный алгоритм, который объяснит, что мне нужно делать, чтобы создать индекс и использовать его для поиска.
Изменить:
Grep не будет работать, поскольку этот поиск необходимо интегрировать в кросс-платформенное приложение. Я никак не смогу качать включив в него какую-то внешнюю программу.
Это работает так, что есть веб-интерфейс с браузером журналов. Это говорит о настраиваемом бэкэнде веб-сервера C ++. Этому серверу необходимо выполнять поиск в журналах за разумное время. В настоящее время поиск нескольких гигабайт логов занимает много времени.
Изменить 2: некоторые из этих предложений отличные, но я должен повторить, что я не могу интегрировать другое приложение, это часть контракта. Но чтобы ответить на некоторые вопросы, данные в журналах варьируются от полученных сообщений в формате, специфичном для здравоохранения, или сообщений, относящихся к ним. Я хочу полагаться на индекс, потому что, хотя восстановление индекса может занять до минуты, поиск в настоящее время занимает очень много времени (я видел, что это занимало до 2,5 минут). Кроме того, многие данные отбрасываются еще до их записи. Если не включены некоторые параметры ведения журнала отладки, более половины сообщений журнала игнорируются.
Поиск в основном выглядит следующим образом: пользователю в веб-форме предоставляется список самых последних сообщений (потоковая передача с диска при прокрутке, ура для ajax), обычно они хотят искать сообщения с некоторой информацией в это может быть идентификатор пациента или какая-то строка, которую они отправили, и поэтому они могут ввести строку в поиск. Поиск отправляется асинхронно, и пользовательский веб-сервер линейно просматривает журналы по 1 МБ за раз для получения некоторых результатов. Этот процесс может занять очень много времени, когда журналы станут большими. И это то, что я пытаюсь оптимизировать.