Erlang: оптимизировать сложный qlc - PullRequest
20 голосов
/ 12 апреля 2011

у меня 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 - это тип сумки, а 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) тегов.

Мне нужно проверить, не заблокирован ли один конкретный идентификатор другими. Он блокируется, когда число идентификаторов, соответствующих любому из его шаблонов, в их теге = его шаблоне и их статусе = его шаблоне. Состояние больше или равно его пределу шаблона.

Есть ли способ оптимизировать qlc?

1 Ответ

1 голос
/ 03 июня 2011

Если у вас нет другого, более эффективного отношения равенства для использования, у вас есть такой же хороший код. Я полагаю, вы профилировали этот код и нашли его слишком медленным? Каким образом?

...