Erlang 不使用原子创建记忆表

Erlang 不使用原子创建记忆表,erlang,ejabberd,mnesia,Erlang,Ejabberd,Mnesia,我需要为每个ejabberd用户创建一个mnesia表。由于用户很大,并且他们的用户名事先未知,因此必须在运行时创建带有用户名的mnesia表。目前,这是通过为表名动态创建原子来实现的,因为mnesia:create_table方法使用以下代码将表名作为原子 -record(schedule_msg, {schedule_hash, from, to, packet, pid}). mnesia:create_table(list_to_atom(lists:concat(["schedule

我需要为每个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)}]),
在中,建议不要动态创建原子,因为它不是垃圾收集的,并且原子查找表的大小是有限的

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

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

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

你不能

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


是的,这是个坏主意。Mnesia表是一个有限的资源,如果没有很好的理由,您不想创建数千个表。

建议不要动态创建原子,这确实是为了让您仔细思考这是否是一个好主意。如果你知道不会有太多,那么你可以考虑打破建议,但显然如果你用完它完全打破运行时间。ETS表的数量也有限制,但您至少可以对其进行调整。在不知道具体情况的情况下,很难说清楚,但如果你担心耗尽100万原子极限的一半,那么可能每个用户一张表也不理想。我当然想自己尝试另一种方式。