Получить или рассчитать общий размер Mnesia - PullRequest
1 голос
/ 05 мая 2020

Я хочу найти общий размер базы данных мнезии. У меня только один узел.

Могу ли я получить размер мнезии из какой-либо функции или как-то рассчитать его?

Я просмотрел документацию http://erlang.org/doc/man/mnesia.html , но я не могу найти функцию для получения такой информации для всей базы данных.

Нужно ли мне рассчитывать ее для каждой таблицы, используя table_info/2? И если да, то как?

ПРИМЕЧАНИЕ: я не знаю, как это сделать с текущими точками данных, размер равен 2 (для тестирования у меня есть только 2 записи), а память - 348.

1 Ответ

1 голос
/ 06 мая 2020

Вам нужно перебрать все таблицы с помощью mnesia:system_info(tables) и прочитать память каждой таблицы с помощью mnesia:table_info(Table, memory), чтобы получить количество слов , занятых вашей таблицей. Чтобы преобразовать это значение в байты, вы можете сначала использовать erlang:system_info(wordsize), чтобы получить размер слова в байтах для вашей машинной архитектуры (в 32-битной системе слово составляет 4 байта, а 64 бит - 8 байтов) и умножить его на вашу Mnesia таблица памяти. Примерная реализация:

%% Obtain the memory in of bytes of all the mnesia tables.
-spec get_mnesia_memory() -> MemInBytes :: number().
get_mnesia_memory() ->
  WordSize = erlang:system_info(wordsize),
  CollectMem = fun(Tbl, Acc) ->
   Mem = mnesia:table_info(Tbl, memory) * WordSize,
   Acc + Memory
  end,
  lists:foldl(CollectMem, 0, mnesia:system_info(tables)).
...