EBils - Erlang Binary Lightweight Search
Une seule recherche binaire pour un grand et énorme binaire en Erlang pur, cela utilise un petit morceau de binaires pour y rechercher en utilisant des processus uniques et en livrant un message au processus principal.
Avec des tests uniques d'un grand binaire, cette méthode peut être 17x plus rapide que le seul binary:match et vous permet de rechercher des résultats dans le processus.
Un seul exemple:
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 " >>}Dans l'exemple:
Chargez un binaire dans le système à utiliser après pour rechercher des matchs, vous pouvez spécifier le nom des travailleurs, la durée des travailleurs créés pour traiter le binaire et le modèle pour diviser les morceaux.
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
Recherchez un seul binaire dans le binaire préchargé, vous pouvez spécifier le binaire à rechercher et le nom des travailleurs, (nom par défaut à eBils, utilisé avec 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()}
Obtenez les données du processus où le binaire a été trouvé. Utilisez un appel Gen_Server simple à l'aide du PID où trouvé les données et le tuple des données trouvées, vous devez également fournir un troisième paramètre contenant la taille des données à récupérer.
ebils:fetch(pid(), {get, {found, {non_neg_integer(), non_neg_integer}}, integer}) -> {ok, binary()}
Déchargez toutes les données conservées dans les processus et tuez les processus, vous pouvez spécifier le nom pour les travailleurs, cette méthode sera utile pour réécrire les données (si les modifications binaires)
ebils:unload() -> ok
ebils:unload(Name::atom()) -> ok
Actualisez les morceaux et les travailleurs (processus) avec de nouveaux binaires dans leur état
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