使用ets mnesia context进行只读操作

时间:2014-03-13 09:12:27

标签: erlang mnesia ets

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

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).

1 个答案:

答案 0 :(得分:1)

鉴于你有

  • 其他地方的脏交易,所以你不担心同步
  • ram_copies,所以你不关心检查站
  • 所有节点上都复制了所有表,因此所有读取都是本地的
  • 您只是在阅读,因此不需要通知远程节点

etsasync_dirty之间的效果没有区别。您可以通过绕过async_dirty进行的大量测试来看到一些小的速度改进,但我不希望它会有明显的增益。

作为一般惯例,我建议在任何地方使用一种交易类型(定义为宏),并且只有在您发现真正的速度改进时才会出现分歧。否则,您可能会遇到错误,例如在您的ets交易中添加写入或违反上述其他假设之一,然后您就会沉没。