EBILS - Erlang Binary Lightweight Search
Una búsqueda binaria única de un binario grande y enorme en Erlang puro, esto utiliza una pequeña porción de binarios para buscar en ellos utilizando procesos únicos y entregando un mensaje al proceso principal.
Con pruebas únicas de un gran binario, este método puede ser 17 veces más rápido que un solo binary:match y le permite buscar resultados en el proceso.
Un solo ejemplo:
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 " >>}En el ejemplo:
Cargue un binario en el sistema para usar después para buscar coincidencias, puede especificar el nombre de los trabajadores, la duración de los trabajadores creados para procesar el binario y el patrón para dividir los trozos.
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
Busque un solo binario en el binario precargado, puede especificar el binario para buscar y el nombre de los trabajadores (nombre predeterminado a Ebils, utilizado con Ebils: Búsqueda/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()}
Obtenga los datos del proceso donde se encontró el binario. Use una llamada simple Gen_Server utilizando el PID donde se encuentran los datos y la tupla de los datos encontrados, también debe proporcionar un tercer parámetro que contenga el tamaño de los datos para recuperar.
ebils:fetch(pid(), {get, {found, {non_neg_integer(), non_neg_integer}}, integer}) -> {ok, binary()}
Descargar todos los datos mantenidos en los procesos y matar los procesos, puede especificar el nombre para los trabajadores, este método será útil para volver a ejecutar los datos (si los cambios binarios)
ebils:unload() -> ok
ebils:unload(Name::atom()) -> ok
Actualice los trozos y los trabajadores (procesos) con nuevos binarios en su estado
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