【问题标题】:Should a mapping of Id to Pid be stored in an ets table, or the gen_server's state?Id 到 Pid 的映射应该存储在 ets 表中还是 gen_server 的状态中?
【发布时间】:2013-06-01 19:30:08
【问题描述】:

我正在构建一个 OTP 应用程序,该应用程序遵循类似于 trapexit 中描述的模式,其中我使用 gen_server:call/3 实现了一个非阻塞 gen_server 以启动一个带有后端的事务并将事务 id 的映射存储到From pid。当 gen_server 收到来自后端的消息时,它会提取事务 id 并使用此映射来查找正确的 pid,然后将消息转发到。

在 trapexit 示例中,此映射是使用 ets 实现的,但是我发现让 gen_server 的状态包含具有这些映射的 dict 是一个非常自然的解决方案。

对于我的特定用例,映射最多包含 200 个条目。

推荐哪种实现方式?

提前致谢!

【问题讨论】:

    标签: erlang erlang-otp


    【解决方案1】:

    与 ets 相比,200 足以对性能产生一些影响(可能是一个数量级或更少)。您必须问自己的真正问题是“我需要这种额外的性能还是就足够了?”。

    如果性能不是问题,请使用 dict。

    【讨论】:

    • 感谢您的回答!很抱歉要求更多,但是是什么因素使 dict 的性能比 ets 的条目如此少?一个简短的描述或链接将不胜感激,如果你太忙了不用担心!
    • ets 不参与垃圾收集,与 dict 相比,用于更大的数据集。这里有很多关于它的讨论erlang.2086793.n4.nabble.com/…。
    • 我记得我和一位同事做过很多基准测试,存储键/值对的两种最快方法是 ets 和过程字典。 erlang.org/course/advanced.html#dict
    【解决方案2】:

    功能性方法是保持您的私人数据处于状态。然而,反对拥有非常大的状态数据(您的数据似乎不是)的一个实际考虑因素是它会被转储到崩溃日志中。

    【讨论】:

      猜你喜欢
      • 2011-05-15
      • 2014-11-30
      • 2023-02-23
      • 1970-01-01
      • 2014-10-16
      • 2011-10-07
      • 1970-01-01
      • 1970-01-01
      • 2017-02-02
      相关资源
      最近更新 更多