Ebils - Erlang Binary Lightweight Search
Единственный бинарный поиск крупного и огромного двоичного значения в чистый эрланг, он использует небольшую часть двоичных файлов для поиска в них, используя отдельные процессы и передачу сообщения в основной процесс.
С отдельными тестами большого двоичного метода этот метод может быть в 17x быстрее, что одно binary:match и позволяет вам искать результаты в процессе.
Один пример:
1 > { ok , File } = file : read_file ( " test.data " ).
{ ok ,<< " AAAAAAAA|J|89 n BBBBBBBB|J|89 n CCCCCCC|J|89 n DDDDDDDD|J|89 n EEEEEEE|J|89 n FFFFFFFF|J|89 n " ...>>}
2 > byte_size ( File ).
234179947
3 > ebils : load ( File , << " n " >>).
true
4 > timer : tc ( ebils , search , [<< " ZbZbZbZbZb " >>]).
{ 4031 ,{{ ok ,{ 2341677 , 13 }, < 0.161 . 0 > }}
5 > { Found , Pid } = ebils : search (<< " ZbZbZbZbZb " >>).
{ ok ,{ 2341677 , 13 }, < 0.160 . 0 > }
6 > ebils : fetch ( Pid , { get , { found , Found }, 4 }).
{ ok ,<< " ZbZbZbZbZb|J|89 " >>}В примере:
Загрузите бинарную систему для использования после поиска совпадений, вы можете указать название для работников, продолжительность работников, созданных для обработки бинарного и шаблона для разделения кусков.
ebils:load(Binary::binary(), Pattern::binary()) -> true
ebils:load(Name::atom(), Binary::binary(), Pattern::binary()) -> true
ebils:load(Name::atom(), Binary::binary(), Pattern::binary(), Workers::non_neg_integer()) -> true
Поиск одного двоичного файла в предварительно загруженный двоичный файл, вы можете указать двоичный файл для поиска и имя для рабочих (имя по умолчанию в Ebils, используется с Ebils: Search/1)
ebils:search(Binary::binary()) -> {ok, {non_neg_integer(), non_neg_integer()}, pid()}
ebils:search(Name::atom(), Binary()) -> {ok, {non_neg_integer(), non_neg_integer()}, pid()}
Получите данные из процесса, где был найден двоичный файл. Используйте простой вызов Gen_Server, используя PID, где обнаружили данные и кортеж из найденных данных, также вы должны предоставить третий параметр, содержащий размер данных для извлечения.
ebils:fetch(pid(), {get, {found, {non_neg_integer(), non_neg_integer}}, integer}) -> {ok, binary()}
Выгрузите все данные, хранящиеся в процессах и убить процессы, вы можете указать имя для работников, этот метод будет полезен для повторного запуска данных (если бинарные изменения)
ebils:unload() -> ok
ebils:unload(Name::atom()) -> ok
Обновить куски и работники (процессы) с новыми двоичными файлами в их штате
ebils:reload(Binary :: binary() | [binary(), ...], Pattern :: binary()) -> ok
ebils:reload(Name :: atom(), Binary :: binary() | [binary(), ...], Pattern :: binary()) -> ok
ebils:reload(Name :: atom(), Binary :: binary() | [binary(), ...], Pattern :: binary(), Workers :: non_neg_integer()) -> ok