Подтвердить что ты не робот

Erlang: оптимизировать комплекс 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 - это набор мешков типа, а 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) тегов.

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

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

4b9b3361

Ответ 1

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