我有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}}
我。即对于每个Ref,有一个定义,一个或两个(四个)状态,零个或多个(大多数情况下不超过3个)模式和零个或多个(大多数情况下不超过3个)标签。
我需要测试一个特定标识符是否被其他人阻止。如果标识符的数量与其Tag =其模式上的任何模式匹配,并且其状态=其模式Status大于或等于其模式Limit,则会被阻止。
有没有办法优化qlc?
答案 0 :(得分:1)
除非你有一个不同的,更有效的使用平等关系,否则你拥有的代码就像它获得的那样好。我想你已经分析了这段代码并发现它太慢了?以什么方式?