Erlang:优化复杂qlc

我有QLC
RefsBlocked = qlc:e(qlc:q([
    Ref1 ||
    {{Ref1, {pattern, {_Status1, _Pattern1, Limit1}}}, Count} <- dict:to_list(
        qlc:fold(
            fun({Key, _Ref2}, Acc) ->
                dict:update_counter(Key, 1, Acc)
            end,
            dict:new(),
            qlc:q([
                {{Ref1, {pattern, {Status1, Pattern1, Limit1}}}, Ref2} ||
                {Ref2, {status, Status2}} <- ets:table(Tmp),
                {Ref3, {tag, Tag3}} <- ets:table(Tmp),
                Ref2 =:= Ref3,
                {Ref1, {pattern, {Status1, Pattern1, Limit1}}} <- ets:table(Tmp),
                Ref =:= Ref1,
                Status1 =:= Status2,
                Pattern1 =:= Tag3
            ])
        )
    ),
    Count >= Limit1
], unique))
其中Tmp是bag类型的ets,而Ref是我需要测试的特定标识符。 Ets包含数百至数千个条目,例如
{Ref1, {definition, {Tuple1}}}
{Ref1, {status, scheduled}}
{Ref1, {status, blocked}}
{Ref1, {pattern, {scheduled, Pattern11, Limit11}}}
{Ref1, {pattern, {dispatched, Pattern12, Limit12}}}
{Ref1, {tag, Tag11}}
{Ref2, {definition, {Tuple2}}}
{Ref2, {status, scheduled}}
{Ref2, {status, dispatched}}
{Ref2, {pattern, {scheduled, Pattern21, Limit21}}}
{Ref2, {pattern, {dispatched, Pattern22, Limit22}}}
{Ref2, {tag, Tag21}}
{Ref3, {definition, Tuple3}}
{Ref3, {status, error}}
一世。 e。对于每个引用,都有一个定义,一个或两个(四个)状态,零个或多个(在大多数情况下不超过3个)模式和零个或多个(在大多数情况下不超过3个)标签。 我需要测试一个特定的标识符是否被其他标识符阻止。当在其标签上匹配其任何模式的标识符的数量=其模式和其状态=其模式Status大于或等于其模式限制时,将阻止该操作。 有没有一种方法可以优化QLC?     
已邀请:
除非您要使用其他不同,更有效的相等关系,否则您拥有的代码将尽其所能。我想您已经剖析了此代码,发现它太慢了?用什么方式?     

要回复问题请先登录注册