【问题标题】:Erlang: optimizing mnesia tables for read/write concurrencyErlang:优化 mnesia 表以实现读/写并发
【发布时间】:2015-01-17 09:11:04
【问题描述】:

我正在使用 mnesia 开发一个新的 Erlang 项目。当我之前使用 ets 时,我可以设置针对读取并发、写入并发或两者进行优化的 ets 表。我最初认为我可以对 mnesia 表做同样的事情,但到目前为止,我还没有通过查看文档找到如何做到这一点(这让我感到惊讶,因为 mnesia 是基于我理解的 ets/dets)。

有人知道这是否可行吗?

【问题讨论】:

    标签: optimization erlang mnesia


    【解决方案1】:

    来自文档:

    {storage_properties,[{后端,属性}]。将其他属性转发到后端存储。后端当前可以是 ets 或 dets,属性是在表创建期间发送到后端存储的选项列表。属性可能不包含已被 mnesia 使用的属性,例如 type 或 named_table。

    例如:

    mnesia:create_table(table, [{ram_copies, [node()]}, {disc_only_copies, nodes()},
                    {storage_properties,
                     [{ets, [compressed]}, {dets, [{auto_save, 5000}]} ]}])
            
    

    但这也不是那么简单。 Mnesia 的关键在于它是分布式数据库,具有复制或蠕动等功能。但这也引入了诸如复制和开销之类的开销。修补这些可能是优化的主要来源。这对于 mnesia 中的事务和脏操作等概念尤其重要。

    在 Ets 中,所有操作都是原子的,这或多或少很容易实现,因为所有数据都位于一个位置(并且使写入读取优化也更容易)。在 mnesia 中,要使写入原子化(确保其正确性),您需要在可能的多个节点上创建锁。

    但这并不意味着所有与 mnesia 表的交互都必须包含在严格的事务中。也许你在那里有一些脏读或写。

    这一切都取决于您的数据,这意味着什么,是否有任何交错,以及您将如何(有多少确定性?)使用它。因此,它更多地取决于您的域,而不是任何 mnesia 设置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-25
      • 2015-07-09
      • 2019-06-05
      • 2013-05-20
      • 2016-05-24
      • 1970-01-01
      • 2014-06-06
      • 2016-09-18
      相关资源
      最近更新 更多