2011-04-12 11 views
20

tengo qlcErlang: optimizar qlc complejo

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 la bolsa de tipo y Ref es un identificador particular, 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}} 

i. mi. 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 comprobar si un identificador particular está bloqueado por otros. Se bloquea cuando la cantidad de identificadores que coinciden con cualquiera de sus patrones en su Etiqueta = su Patrón y su Estado = su estado de patrón es más o igual a su Límite de patrón.

¿Hay alguna manera de optimizar qlc?

+3

¿Se llama Erlang porque la gente lo lee y se va, eh ...? Es una broma :) –

Respuesta

1

A menos que tenga una relación de igualdad de uso diferente, más eficiente, el código que tiene allí es tan bueno como se pone. Imagino que ha perfilado este código y lo encontró demasiado lento. ¿En qué manera?