【发布时间】:2015-01-17 09:11:04
【问题描述】:
我正在使用 mnesia 开发一个新的 Erlang 项目。当我之前使用 ets 时,我可以设置针对读取并发、写入并发或两者进行优化的 ets 表。我最初认为我可以对 mnesia 表做同样的事情,但到目前为止,我还没有通过查看文档找到如何做到这一点(这让我感到惊讶,因为 mnesia 是基于我理解的 ets/dets)。
有人知道这是否可行吗?
【问题讨论】:
标签: optimization erlang mnesia
我正在使用 mnesia 开发一个新的 Erlang 项目。当我之前使用 ets 时,我可以设置针对读取并发、写入并发或两者进行优化的 ets 表。我最初认为我可以对 mnesia 表做同样的事情,但到目前为止,我还没有通过查看文档找到如何做到这一点(这让我感到惊讶,因为 mnesia 是基于我理解的 ets/dets)。
有人知道这是否可行吗?
【问题讨论】:
标签: optimization erlang mnesia
来自文档:
{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 设置。
【讨论】: