【发布时间】: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 原子限制的一半,那么每个用户的表可能也不理想。我当然想自己尝试另一种方式。