Re: Efficiency of big return functions?

Pablo Polvorin <[email protected]>
Newsgroups gmane.comp.lang.erlang.general
Message-ID <[email protected]>

> On 27 Aug 2020, at 06:51, Oliver Korpilla <[email protected]> wrote:
> 
> Hello,
> 
> I have some data that's between 100K and 1M in size, depending if I use
> the whole data set or just a part. Access is read-only.
> 
> So far we kept a copy in each process for latency reasons and
> performance has been quite good. There can be quite a lot of processes
> (1,000s) but we have some big machines to run them on...
> 
> So far we haven't considered ETS or Mnesia because all these processes
> would have to go through a single bottleneck in rather short order (they
> are truly parallel and independent from each other and we have lots of
> cores to schedule them on) - or am I wrong? How well does it scale?
Ets lookups would rarely be a bottleneck in my experience (and you can
speedup reads using the `read_concurrency` option, if the data is mostly static). 
*but* if the data you are trying to retrieve from ets is large, that *could* be a bottleneck since
matching data need to be copied from ets to the process heap on each lookup.

> 
> That said, we had good experiences with moving some static configuration
> information to code. Performance is really good, but that data was
> roughly of the format of a keyed map or smaller lists.

This might be of your interest.  We use it exactly for this case, a large complex
data structure that need to be consulted on every request.
https://erlang.org/doc/man/persistent_term.html <https://erlang.org/doc/man/persistent_term.html>

However, if your doubt is just regarding function returns, there is nothing to worry
see below.

> 
> The data we're looking at are big lists (potentially 1,000s of entries)
> of medium-sized maps, or maybe a map serving as index into these other maps.
> 
> My question is - how do I efficiently return a big static value (a list
> of maps with no parameters to change their construction) from a
> function? Does BEAM optimize this? Or is the value constructed when the
> function is called? And is there anything I can do to improve it?
> 
Data returned from function call is already on the process’ heap, so no copy
is needed, you basically return a pointer.  Same is true for the parameters you pass
to the function.
The size of the struct matters when you need to pass it from one process to another.





> Thank you!
> Oliver
> 
> 
> --
> Diese E-Mail wurde von Avast Antivirus-Software auf Viren geprüft.
> https://www.avast.com/antivirus
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.