@useers

Поиск по байтовому массиву?

Дано:
1) большой файл, состоящий из байтовой каши;
2) целевая строка, а точнее - определенная последовательность из 20 байт.

Вопрос:
Как осуществить быстрый поиск цели в таком файле?

Edit: поиск в файле нужно делать часто, т.к. целевая срока не одна и постоянно меняется;
данные в файле - просто набор подряд идущих байт, а мне нужно найти заданный набор из 20 байт.
  • Вопрос задан
  • 153 просмотра
Решения вопроса 1
EvgenyMamonov
@EvgenyMamonov Куратор тега Go
Senior software developer, system architect
Думаю это сильно зависит от того, как часто вам нужно делать поиск в этом файле.
Если не часто - тогда можно просто вычитывать данные порциями, и искать последовательность в них.
Если же очень часто - нужно понять что там за данные и думать как сделать индекс для поиска в этом файле.

Как вариант, можно запустить несколько горутин.
Т.е. пока одна горутина читает одну порцию данных из файла в память - другая ищет в предыдущей порции нужную вам последовательность.

Еще, как вариант, можно сделать простенький индекс (упрощаю, чтобы было легче писать понятный пример)

Допустим у нас есть файл с таким содержимым
0x02 0x09 0x02 0x05 0x09 0x09, 0xf1 0xfa 0x02

Найти нужно последовательность 0x02 0x05

Строим индекс [массив байт от 0x00 до 0xff][слайс адресов этого байта в файле]
т.е.
[значение байта][адрес этого байта в файле1, адрес этого байта в файле2, адрес этого байта в файле3...]
Для указанного файла индекс получится вот такой
[0x00][]
[0x01][]
[0x02][0x00, 0x02, 0x08]
...
[0x05][0x03]
...
[0x09][0x01, 0x04, 0x05]
...
[0xf1][0x06]
...
[0xfa][0x07]
...

Первый байт в искомой последовательности 0x02 0x05 - будет 0x02.
Мы берём слайс в массиве по индексу 0x02 и получаем список адресов где в файле есть 0x02 - [0x00, 0x02, 0x08]
А дальше вы проверяете вашу последовательность только начиная с полученных смещений
Т.е. проверяем следующий байт по адресу 0x00 + 1 == 0x05 (второму символу последовательности) или нет.
Если нет - значит берём след. смещение 0х02 и опять проверяем равен ли след. символ 0x05.
Равен, значит нашли последовательность.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы