Ebils - Pesquisa leve binária de Erlang
Uma única pesquisa binária por um binário grande e enorme em Erlang puro, que usa pequeno pedaço de binários para pesquisá -los usando processos únicos e entregando mensagem ao processo principal.
Com testes únicos de um grande binário, esse método pode ser 17x mais rápido que o binary:match e permite buscar resultados no processo.
Um único exemplo:
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 " >>}No exemplo:
Carregue um binário no sistema a ser usado após a busca de partidas, você pode especificar o nome para os trabalhadores, a duração dos trabalhadores criados para processar o binário e o padrão para dividir os pedaços.
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
Pesquise um único binário no binário pré -carregado, você pode especificar o binário para procurar e o nome para os trabalhadores (nome padrão para ebils, usado com ebils: pesquisa/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()}
Obtenha os dados do processo em que o binário foi encontrado. Use uma chamada simples do Gen_Server usando o PID, onde encontrou os dados e a tupla dos dados encontrados, também deve fornecer um terceiro parâmetro que contenha o tamanho dos dados para recuperar.
ebils:fetch(pid(), {get, {found, {non_neg_integer(), non_neg_integer}}, integer}) -> {ok, binary()}
Descarregue todos os dados mantidos em processos e matem os processos, você pode especificar o nome para os trabalhadores, esse método será útil para executar novamente os dados (se alterações binárias)
ebils:unload() -> ok
ebils:unload(Name::atom()) -> ok
Atualize os pedaços e os trabalhadores (processos) com novos binários em seu 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