optimization - long - Erlang: optimizar qlc complejo
title tag (1)
A menos que tenga una relación de igualdad diferente y más eficiente para usar, el código que tiene allí es tan bueno como es posible. Me imagino que has perfilado este código y lo has encontrado demasiado lento? ¿En qué manera?
Tengo 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))
donde Tmp es un ets de tipo bag y Ref es un identificador particular que necesito probar.
Ets contiene de cientos a miles de entradas como
{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}}
es decir, para cada Ref. hay una definición, uno o dos (de cuatro) estados, cero o más (en la mayoría de los casos no más de 3) patrones y cero o más (en la mayoría de los casos no más de 3) etiquetas.
Necesito probar si un identificador particular está bloqueado por otros. Se bloquea cuando el número de identificadores que coinciden con cualquiera de sus patrones en su Etiqueta = su Patrón y su Estado = su patrón Estado es más o igual a su patrón Límite.
¿Hay alguna forma de optimizar qlc?