使用ETS MNESIA上下文进行仅阅读操作



i有一个复制到所有可用节点的MNESIA ram_copies表。几乎所有使用此表的操作都以肮脏模式执行。在ets上下文中使用mnesia:foldl的后果是什么?

mnesia:activity(ets, fun() ->
  mnesia:foldl(fun(V, Acc) ->
      case V#my_table.field > 0 of
        true -> Acc;
        false -> Acc + 1
      end
    end, 0, my_table)
end).

给定您有

  • 其他地方的肮脏交易,所以您不必担心同步
  • ram_copies,所以您不在乎检查点
  • 在所有节点上复制的所有表
  • 您只在阅读,因此不需要通知远程节点

etsasync_dirty之间的影响没有差异。您可能会通过绕过async_dirty的许多测试来看到一些较小的速度提高,但我不会期望这是一个明显的收益。

作为一般实践,我建议到处使用一种交易类型(定义为宏),并且只有在发现实际速度改进时就会有所不同。否则,您可能会出现错误,例如在ets交易中添加写入或违反上面的其他假设之一,然后沉没。

相关内容

  • 没有找到相关文章

最新更新