lalo2302

lalo2302

Represent a tree with specific constraints with processes. Too much memory?

Hi everyone.

I am working on a personal project where I need to represent a horizontal tree in a visual way for a user to interact with it, like shown at FIG. 1.

FIG. 1

I have thought about representing it as a list of lists as it usually goes, but I have this constraints:

  • I need to increase the depth of the tree at user request
  • The content of the new nodes (at depth expansion) depends solely on the leafs of the tree

To do this, I need to know the content of each leaf every time I want to increase its depth, and transversing the lists every time seems unnecessary and expensive. With other programming languages I could store the memory reference of each leaf at creation time, but with elixir this is not possible.

It came to my mind the possibility to make every node a process, having a “tree manager” that stores the PID of the root and the PIDs of each leaf. Leading to interact directly with the leafs at depth expansion without interacting with the rest of the nodes. But my lack of experience doesn’t let me know if this is unnecessary memory usage, seeing that a process uses 338 words when spawned, including a heap of 233 words compared with other data structures.

The tree is not very wide, but can increase its depth at user request. Maybe I can set a limit to change the root of the tree for one closer to the leafs every time the user passes it.

What do you guys think?

Marked As Solved

OvermindDL1

OvermindDL1

I would just represent it as a map of maps, or if you really need efficiency with querying and such then perhaps a :graph (the BEAM comes with a graph module for graph data structures).

Also Liked

kokolegorille

kokolegorille

That might be a good use case to test neo4j.

OvermindDL1

OvermindDL1

Easier to do positional lookup primarily, but there is also the idea that you could encode the path as keys and just flatten the whole tree into a single map (at which point if you need full speed then you could lift that into ETS itself later on). :slight_smile:

kokolegorille

kokolegorille

With FP You can use a [zipper](Zipper (data structure) - Wikipedia to traverse the tree.

@OvermindDL1 could explain what a zipper is much better than I might.

Last Post!

lalo2302

lalo2302

Wow.

but there is also the idea that you could encode the path as keys and just flatten the whole tree into a single map

Didn’t thought about that, thank you a lot for the suggestion. At the beginning I was thinking on creating the tree first, and then transverse it to “draw” it on the browser with dot. But I could draw it on the go and at the same time save the tree as a flat map. So if the user wants to access a node, or expand the tree, I can access directly to its value on the map. :thumbsup:

Where Next?

Popular in Questions Top

RisingFromAshes
I’ve read in another post that it may be possible with a router helper - but I couldn’t find an appropriate one, and tbh, I’m still just ...
New
ovidiubadita
Hey all, I discovered Elixir and I love it. I always wanted to learn a functional programming and I intended to go for Haskell, but afte...
New
lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New
stefanchrobot
What’s the safe way to decode a JSON string into a struct? I want to avoid calling String.to_atom. Jason.decode can give me a map with st...
New
fireproofsocks
Forgive me if this is obvious, but how does one delete a database record WITHOUT selecting it first? Ecto.Repo — Ecto v3.14.0 has exampl...
New
komlanvi
Hi everyone, I was playing with phoenix liveView but I run into an issue. I have a form and want to validate each input text when the te...
New
JorisKok
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New

Other popular topics Top

openscript
Hello! Sorry for this astonishing simple question, but I’m really stuck. I try to set up the intellij-elixir plugin, but I don’t know ho...
New
ashish173
I am using Ecto timestamps with postgres, I can see the timestamps() use the :naive_dateime but for my use case I wanted to store the ti...
New
dokuzbir
I want to highlight html closing tags when i click a html tag. That works in .html files but doesnt work for html.eex templates. How can...
New
AngeloChecked
What learn first? Rust or Elixir Hi Elixir community! I’m here because i want learn a new language. I’m a junior developer and mainly i ...
New
TunkShif
This post is an instruction guide to help you setup your Neovim for Elixir development from scratch. It includes general information on h...
274 42533 114
New
AstonJ
Posting this to see if we can make things easier for people to get into Neovim. If you use Neovim and have a favourite distro please let ...
New

We're in Beta

About us Mission Statement