<div dir="ltr"><div dir="ltr"><ol><li>ETS and Mnesia (with underlying ETS storage) will copy values on return. They are good if you do the query using their own mechanisms, and return only small data that is needed by your logic.</li><li>Returning a root of a huge structure on the process heap is cheap (copying a pointer), but only for this same process. If you pass it to another process, a full copy will be created.<br>(This matches your use case, if you do not let the data cross process boundaries, it will be efficient but consume more memory)<br></li><li>Returning a static literal value hardcoded in your .ERL file is always cheap, until you reload the module and the static data you used may possibly be "garbage-collected" and moved to a regular process heap becoming just a regular big value (same problem as in (2) you can work efficiently in the same process but do not pass it between processes).<br></li></ol></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, 27 Aug 2020 at 11:51, Oliver Korpilla <<a href="mailto:oliver.korpilla@gmx.de">oliver.korpilla@gmx.de</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hello,<br>
<br>
I have some data that's between 100K and 1M in size, depending if I use<br>
the whole data set or just a part. Access is read-only.<br>
<br>
So far we kept a copy in each process for latency reasons and<br>
performance has been quite good. There can be quite a lot of processes<br>
(1,000s) but we have some big machines to run them on...<br>
<br>
So far we haven't considered ETS or Mnesia because all these processes<br>
would have to go through a single bottleneck in rather short order (they<br>
are truly parallel and independent from each other and we have lots of<br>
cores to schedule them on) - or am I wrong? How well does it scale?<br>
<br>
That said, we had good experiences with moving some static configuration<br>
information to code. Performance is really good, but that data was<br>
roughly of the format of a keyed map or smaller lists.<br>
<br>
The data we're looking at are big lists (potentially 1,000s of entries)<br>
of medium-sized maps, or maybe a map serving as index into these other maps.<br>
<br>
My question is - how do I efficiently return a big static value (a list<br>
of maps with no parameters to change their construction) from a<br>
function? Does BEAM optimize this? Or is the value constructed when the<br>
function is called? And is there anything I can do to improve it?<br>
<br>
Thank you!<br>
Oliver<br>
<br>
<br>
--<br>
Diese E-Mail wurde von Avast Antivirus-Software auf Viren geprüft.<br>
<a href="https://www.avast.com/antivirus" rel="noreferrer" target="_blank">https://www.avast.com/antivirus</a><br>
<br>
</blockquote></div></div>