2011-04-12 14 views
20

optimize qlc Tmp tipi torbanın ETS ve Referans test etmek gereken belirli bir tanımlayıcıdır Erlang: ı sahip, karmaşık 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)) 

.

Ets yüzlerce girişlerinin Binlerce

{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

gibi gelen içerir. e. Her bir Ref için bir tanım, bir veya iki (dört) durum, sıfır veya daha fazla (çoğu durumda en fazla 3) desen ve sıfır veya daha fazla (çoğu durumda en fazla 3) etiketler vardır.

Belirli bir tanımlayıcının başkaları tarafından engellenip engellenmediğini test etmem gerekiyor. Etiketlerinden herhangi biriyle eşleşen tanımlayıcıların sayısı = Etiketinde ve Kalıbında = durumu Durum, desen Sınırına daha fazla veya eşit olduğunda engellenir.

qlc'yi optimize etmenin bir yolu var mı?

+3

Erlang denir, çünkü insanlar bunu okur ve gider ...? Şaka yapıyorum :) –

cevap

1

Kullandığınız farklı, daha verimli bir eşitlik ilişkiniz yoksa, sahip olduğunuz kodun aldığı kadar iyidir. Bu kodu tahmin ettiğinizi ve çok yavaş bulduğunuzu hayal ediyorum? Ne şekilde?