Mnesia transaction memory is increasing

Hello everyone, I am using Mnesia to build a cacheing system, Encountered a problem:

Every time I use :mnesia.transaction, it will bring little memory consumption. Almost 10,000 :mnesia.transaction calls will consume 1MB of memory.

After some work, I found that the memory occupied by ets’s table: mnesia_transient_decision will continue to increasing. Every call to :mnesia.transaction will insert a record into table mnesia_transient_decision, and even if I use :mnesia_recover.allow_garb and :erlang.garbage_collect, the memory will not decrease. And I can’t delete this table.

Can someone help me? very appreciate

test code:

defmodule TestTransaction do
  alias :mnesia, as: Mnesia
  def init_mnesia do
    Mnesia.create_table(Person, attributes: [:age, :username], disc_copies: [node()])
  def case_trans_read do
    f = fn ->, 2)

  def print_memory_info do
    IO.puts("total: #{:erlang.memory[:total]}, ets: #{:erlang.memory[:ets]}")

  def benchmarking(_, 0), do: nil

  def benchmarking(f, n) do
    apply(TestTransaction, f, [])
    benchmarking(f, n-1)



TestTransaction.benchmarking :case_trans_read, 10000

:observer_cli memory usage of ets:
|Table Name |Size | Memory |Type |Protection |KeyPos |Write/Read |Owner Pid |
|mnesia_transient_decision | 10002 | 1022.1172 KB | set | public | 2 | false/false | <0.214.0> |

Saw your post yesterday and thought this was a chance to dig into a bit of mnesia. I’ve been able to reproduce this although I needed to remove the disc_copies options to get it to run. I see the same issue. Nothing added to the table but memory tied up with ets increases with each transaction call. Have you been able to figur eout the cause of this and any solution ?

@krp Thanks reply.
Actually I have been troubled by this issue for several days. After reading the source code, I found that the increase in mnesia transaction memory is inevitable. The mnesia transaction does not provide an option to avoid inserting records into the ets table(see source code: mnesia_recover:note_decision).

Also according to the code(mnesia_recover:do_allow_garb), even if allow_grab is run, it will still retain the existence of the last 10 ets tables.

So, I haven’t found a solution yet.

I found this similar discussion from 2007 Memory Usage by Mnesia Growing. I tried to reproduce what they found but saw no reset even after 3740006 transactions and memory was up around 400 Mb.

I imagine that eventually it will reset but this is based on the total amount allocated to Erlang. I know I’ve looked at that before but don;t recall the details. If you knew it was going to eventually reset would that work for your needs ?

Thanks reply, this discussion is helpful, but may not solve my problem. My needs are more sensitive to memory usage…