0

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

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

1 回答 1

1

鉴于你有

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

ets和之间的效果没有区别async_dirty。通过绕过许多测试,您可能会看到一些小的速度改进async_dirty,但我不希望它是一个明显的增益。

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

于 2014-03-13T09:49:22.050 回答