<div dir="ltr">Since it is number analysis You want I think I should mention <a href="https://github.com/nygge/number_analysis">https://github.com/nygge/number_analysis</a><div>Originally written by Klacke. It builds a trie in an ETS table.</div><div><br></div><div>/Anders</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Oct 22, 2015 at 3:54 PM, Caragea Silviu <span dir="ltr"><<a href="mailto:silviu.cpp@gmail.com" target="_blank">silviu.cpp@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><span style="background-color:rgb(228,228,255)">Hello,<br><br>@Michael I'm using btree only because of btrie:find_prefix_longest .<br><br>Basically
this is the main functionality I need. As I already posted if you have a
btrie with the following elements ["aa", "a", "b", "bb", "aaa"] and you
call: btrie:find_prefix_longest("aaawhatever") will return the associated value to the key "aaa".<br><br>I
need this for a long table with calling breakouts (prefixes and rate
per prefix) - around 50 k breakouts and basically I call
btrie:find_prefix_longest(<<"phonenumber">>) and it
returns me the prefix and the rate I need to bill for that destination.
Lookup operation seems ok from 1-2.5 ms 95% of time is spent in
ets:lookup. As somebody already pointed out is because ets is doing a
copy. I will change with gen_server state and benchmark again.<br><br>Thanks everyone for suggestions !<div><div><img src="https://ssl.gstatic.com/ui/v1/icons/mail/images/cleardot.gif"></div></div></span><div><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Oct 22, 2015 at 11:38 PM, Michael Truog <span dir="ltr"><<a href="mailto:mjtruog@gmail.com" target="_blank">mjtruog@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor="#FFFFFF" text="#000000"><span>
<div>On 10/22/2015 01:29 AM, Caragea Silviu
wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>Hello.<br>
<br>
</div>
In one of my projects I need to use a radix tree.
I found out a very nice library :<br>
<a href="https://github.com/okeuday/trie" target="_blank">https://github.com/okeuday/trie</a><br>
<br>
</div>
Lookup performances are great. But I have one
problem.<br>
<br>
</div>
Basically my tree has around 100 000 elements so
building it it's an extremely operation. For this
reason I'm building it once and all processes that
needs to do lookups need to share the btrie object
(created using btrie:new/1). <br>
<br>
</div>
Here I see several options:<br>
<br>
</div>
1. Use a gen server and store the btrie object on the
state or process dictionary. - I didn't tried this<br>
</div>
2. Use a ets table and store the tire object on a public
table where all processes can read and write.<br>
</div>
</div>
</div>
</blockquote></span>
It is easier to scale and is more natural in Erlang if you pursue #1
(using the state, not the process dictionary). The #2 path
(including mochiglobal) is typical in imperative programming
(mutating global state). With #1 you can manage the reliability of
individual processes for fault-tolerance concerns and you would
probably start with a single locally registered process name. Then
if there is too much contention for the single process that has the
btrie, you would switch to using a process group, to share the load
with replicated data.<br>
<br>
The btrie usage is probably slower than using the newer maps data
structure. The trie repo was mainly created for string keys, not
binary keys, due to the memory access details in Erlang (i.e., it is
easier to have more efficient lookups with string keys, when using
process heap data, which includes being more efficient than maps in
some cases).<br>
<br>
You could also store the key/value lookup as a single large binary
that you reference (in multiple processes, since large binaries are
reference counted) with something like
<a href="https://github.com/knutin/bisect" target="_blank">https://github.com/knutin/bisect</a> which may work too.<br>
<br>
Best Regards,<br>
Michael<br>
<blockquote type="cite"><span>
<div dir="ltr">
<div>
<div><br>
</div>
Doing some benchmarks I see that lookup-ing for the longest
prefix (btrie:<span style="background-color:rgb(228,228,255)">find_prefix_longest</span>)
in around 100 K elements by prefix it's around 2- 5 ms and 95%
of the time is spent in the ets:<span style="background-color:rgb(228,228,255)">lookup.<br>
<br>
</span></div>
<div>I think the time spent there is so big because also my term
stored there is very big. <br>
<br>
</div>
<div>Any other suggestions ?<br>
<br>
</div>
<div>Silviu<br>
</div>
<div><span style="background-color:rgb(228,228,255)"><br>
</span></div>
</div>
<br>
<fieldset></fieldset>
<br>
</span><span><pre>_______________________________________________
erlang-questions mailing list
<a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a>
</pre>
</span></blockquote>
<br>
</div>
</blockquote></div><br></div></div></div></div>
<br>_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
<br></blockquote></div><br></div>