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.start()
Mnesia.create_table(Person, attributes: [:age, :username], disc_copies: [node()])
end
def case_trans_read do
f = fn ->
Mnesia.read(Person, 2)
end
Mnesia.transaction(f)
end
def print_memory_info do
IO.puts("total: #{:erlang.memory[:total]}, ets: #{:erlang.memory[:ets]}")
end
def benchmarking(_, 0), do: nil
def benchmarking(f, n) do
apply(TestTransaction, f, [])
benchmarking(f, n-1)
end
end
TestTransaction.init_mnesia
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> |