2011-04-12 70 views
20

我有QLC二郎:優化複雜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是類型袋的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 = its Pattern及其狀態=其模式狀態的任何模式的標識符數量大於或等於其模式限制時,它被阻止。

有沒有一種方法來優化qlc?

+3

是不是叫Erlang是因爲人們閱讀它而去,錯......?開玩笑 :) – 2011-05-31 03:40:30

回答

1

除非你有一個不同的,更有效的平等關係的使用,你在那裏的代碼是一樣好。我想你已經剖析了這段代碼,發現它太慢了?以什麼方式?