【问题标题】:Create mnesia tables without using atoms在不使用原子的情况下创建记忆表
【发布时间】:2016-01-28 03:37:15
【问题描述】:

我有一个要求,我需要为每个 ejabberd 用户创建一个 mnesia 表。由于用户很大并且他们的用户名事先不知道,因此必须在运行时创建具有用户名的 mnesia 表。目前这是通过为表名动态创建原子来完成的,因为 mnesia:create_table 方法使用以下代码将表名作为原子。

-record(schedule_msg, {schedule_hash, from, to, packet, pid}).

mnesia:create_table(list_to_atom(lists:concat(["schedule_msg_", From#jid.user])),
        [{disc_only_copies, [node()]}, {type, set},
         {attributes, record_info(fields, schedule_msg)}]),

http://learnyousomeerlang.com/starting-out-for-real#atoms 中,建议不要动态创建原子,因为它不会被垃圾收集并且原子查找表的大小是有限的。

那么如何在不使用 atom 的情况下创建 mnesia 表?

首先,表的数量不应该与用户数量一样多。从性能的角度来看,这是不是一个糟糕的设计?

【问题讨论】:

  • 反对动态创建原子的建议确实让您仔细考虑它是否是一个好主意。如果你知道不会有太多,那么你可以考虑打破推荐,但显然如果你用完了它完全打破了运行时间。 ETS 表的数量也有限制,但您至少可以调整它。在不知道您案例的详细信息的情况下说起来很棘手,但是如果您担心甚至会耗尽 1M 原子限制的一半,那么每个用户的表可能也不理想。我当然想自己尝试另一种方式。

标签: erlang ejabberd mnesia


【解决方案1】:

那么如何在不使用 atom 的情况下创建 mnesia 表呢?

你不能

首先,表的数量不应该与用户数量一样多。从性能的角度来看,这是不是一个糟糕的设计?

是的,这是个坏主意。 Mnesia 表是一种有限的资源,您不想在没有非常好的理由的情况下创建数千个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    • 2012-10-10
    • 2015-12-08
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多