Re[2]: FTS-движок для бинарных данных
От: zx zpectrum  
Дата: 09.09.24 14:11
Оценка: 123 (1)
S>"До хрена и больше" — сколько именно?
S>Какие длины у этих сигнатур — все одинаковые/сильно разные/более-менее похожие?
S>Что вы тут называете N? Количество сигнатур или длину бинарной последовательности, в которой вы ищете данные?
S>Что у вас чаще меняется — строка, в которой ищут, или набор сигнатур?
Приблизительный порядок количества сигнатур — десятки миллионов, с линейным ростом на сотни тысяч в месяц, регулярность пополнения — единицы раз в день. Длины, навскидку, от 6 до 64 байт. На остальные вопросы ответа дать не готов, т.к. всё это пока жуткая экспериментальщина, далекая от реального использования, и сценарии использования могут кардинально поменяться в процессе.

S>В общем, предварительно напрашивается Ахо-Корасик. Он спроектирован ровно для вашей задачи.

Спасибо, да, один из очевидных вариантов. Посмотрю. Однако, бросаться на амбразуру и сразу строить единый граф поиска с таким количеством сигнатур все же, наверное, перебор.
Ради прикола, конечно, попробую Ragel, транслирующий БНФ-нотацию в C-код: он может быть даже всё это хозяйство прожуёт скопом, но в прод такое пускать — жесть Предсказуемость поведения по мере роста корпуса сигнатур под вопросом.

Поэтому тут напрашивается некий упрощенный пре-фильтр. Например, триграммы. Правильной нарезкой на оные, к слову, тривиально реализуется даже индексируемость под поиск по регуляркам, как это было сделано в Google Code Search, хоть это и несколько другая задача:
http://swtch.com/~rsc/regexp/regexp4.html
https://github.com/google/codesearch/

Да и на случай нетекстовых символов оно вполне экстраполируется, т.к. не влечёт никаких допущений о природе документов и сигнатур.

То есть можно попробовать такую двухходовочку: сначала с помощью триграмм получаем сигнатуры-кандидаты, которые "скорее всего" содержатся во входной последовательности.
Затем алгоритмом Ахо-Корасик ищем по этой последовательности за один проход сокращенным множеством сигнатур-кандидатов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.