Новости:

Название темы должно отражать суть задачи.
Темы типа "ПОМОГИТЕ!!!", "Срочно!" и т.п. будут удаляться без объяснения причин

Главное меню

DAX PowerBI Ошибка "Недостаточно памяти для завершения ...и" при вставке формулы

Автор rick1177, 27.06.2021, 09:10:54

« назад - далее »

rick1177

Добрый день, товарищи.
Заранее хочу извиниться, что тема-зеркало, поскольку модератор того форума вероломно и безосновательно выкинул меня.

Если вы повозите, то со своими "глупыми" вопросами я переду сюда)

Вопрос теоретический, поскольку не могу сообразить, как приложить сюда пример с очень большими данными. Ноя очень постараюсь пояснить на созданном маленьком примере.
В  приложенном примере в таблице сводка есть формула расчёта для столбца сумма:
[spoiler]Сумма = MINX(
    FILTER(
        ALL('Данные'),
        'Данные'[Год] ==  'сводка'[Год] &&
        'Данные'[Параметр] == 'сводка'[Параметр]),
    'Данные'[Сумма_по_показателю])
[/spoiler]

Дк вот, на больших данных, где есть гигантская таблица Данные при таком исчислении возникает отвратительная ошибка "Недостаточно памяти для завершения операции. Освободите место и повторите попытку."

Пожалуйста, помогите побороть проблему.

Спасибо.

vikttur

Ну, как бы... Не безосновательно. И не выкинул, а на время закрыл тему до устранения замечания (не нужно забывать писать ответы помощникам в в своих темах). Тема уже открыта

Дмитрий Щербаков(The_Prist)

Цитата: rick1177 от 27.06.2021, 09:10:54поскольку модератор того форума вероломно и безосновательно выкинул меня
Жаловаться на модераторов другого форума здесь не имеет смысла - это же другой форум  :)
По сути: Выражение с использованием AND (тем более в краткой форме - &&) может значительно тормозить и грузить запрос. Лучше в таких случаях применять вложенные друг в друга фильтры. Что-то вроде:
Сумма = MINX( 
    FILTER( 
        FILTER( 
            ALL('Данные'), 'Данные'[Год] =  'сводка'[Год]
         ), 
         'Данные'[Параметр] = 'сводка'[Параметр]), 
    'Данные'[Сумма_по_показателю])
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

rick1177

К Великому сожалению, даже исправленная формула привела к ошибке: "Недостаточно памяти для завершения операции. Освободите место и повторите попытку.".
В оригинале она выглядит так:
[spoiler]Value = MINX(
FILTER(
FILTER(
FILTER(
FILTER( 'Fact',
                    'Fact'[Year] = 'сводка'[Year]),
    'Fact'[REG] = 'сводка'[ID]),
'Fact'[okved] = 'сводка'[okved]),
'Fact'[Attribute] = 'сводка'[Attribute]),
'Fact'[Sum_Year_Atr])
[/spoiler]

Что-то растерялся даже что делать.
Поражает ещё и то, что расчёт идёт на сервере, где объём выделяемой оперативки очень большой... и не хватает.

Дмитрий Щербаков(The_Prist)

Попробуйте самым глубоко вложенным сделать тот фильтр, который в итоге даст самое минимальное кол-во строк. Например, сейчас самый глубоко вложенный фильтр по году. Возможно, ОКВЭД или атрибут дают меньшую выборку.
Плюс теперь совершенно непонятно, причем здесь таблица Данные, размер которой дает ошибку. Fact - это Данные?
И опишите задачу - возможно, сможем найти другую функцию, менее ресурсоемкую.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

rick1177

А можно, пожалуйста, идею понятней раскрутить, чтобы я однозначно сделал то, что Вы сказали?
Т.е. у меня есть 4 критерия фильтрации.
В каждом критерии может приниматься разное количество вариантов, например:
1. Год - 7 вариантов;
2. Регион - 80 вариантов;
3. ОК - 500 вариантов;
4. Атрибут - 200 вариантов;

Как тогда организовать и попробовать вложенность фильтров?

Дмитрий Щербаков(The_Prist)

Цитата: rick1177 от 29.06.2021, 15:24:52идею понятней раскрутить
не знаю, куда понятнее...
Вот например, сколько у Вас строк в таблице Fact с каким-либо годом? А а сколько строк с регионом? А Атрибутом? А с ОК? Исходя чисто из логики - т.к. для ОК вариантов больше всего, то и выборка по ним изначально будет разбита на меньшие блоки для каждого варианта. Вот его и имеет смысл сделать более вложенным. И так далее: потом Атрибут, потом Регион и уже потом - Год. Что-то вроде:
Value = MINX( 
FILTER( 
   FILTER( 
      FILTER( 
         FILTER( 'Fact',   
                    'Fact'[okved] = 'сводка'[okved]), 
          'Fact'[Attribute] = 'сводка'[Attribute]), 
      'Fact'[REG] = 'сводка'[ID]), 
'Fact'[Year] = 'сводка'[Year]), 
'Fact'[Sum_Year_Atr])
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

rick1177

Ещё разок для уточнения переспрошу...т.е. по наружному контуру тот фтльтр, где больше всего вариантов, а чем ближе продвигаемся внутрь - вкладываем всё с меньшим и меньшим количество вариантов:

ОК - 500 вариантов;
       Атрибут - 200 вариантов;
              Регион - 80 вариантов;
                     Год - 7 вариантов;

Дмитрий Щербаков(The_Prist)

В общем да: самый вложенный Filter возвращает таблицу, с которой будут работать другие Filter. Вот она и должна быть изначально самой по возможности маленькой. И так по нарастающей. Я же даже пример привел непосредственно Вашей формулы.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

rick1177

Попробовал, провёл расчёт... результат, к несчастью, тот же... не катит.

Дмитрий Щербаков(The_Prist)

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Яндекс.Метрика Рейтинг@Mail.ru