tag long length google description optimization join erlang ets

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?