Страницы: 1
RSS
PQ. Оптимизация запроса поиска повторных значений
 
Добрый день. Есть код, написанный ув. surkenny, который находит повторяющиеся значения и их количество повторений. Может ли кто нибудь оптимизировать его? С большими массивами данных, работает супер долго. При этом мой пк совсем не в нагрузке. Даже не на 20%. Ни процессор, ни озу:( В чём может быть проблема или эксель берет сколько надо? Код и пример:
Код
let
  src = Table.Buffer ( Excel.CurrentWorkbook(){[ Name = "data" ]}[Content] ),
  clmnNames = List.Buffer ( Table.ColumnNames ( src ) ),
  filterValues = List.Buffer ( Excel.CurrentWorkbook(){[ Name = "filterValues" ]}[Content][Значение] ),
  addComb = Table.AddColumn (
    src,
    "comb",
    each List.Accumulate (
      List.Sort ( List.Difference ( List.RemoveNulls ( List.Distinct ( Record.ToList ( _ ) ) ), filterValues ) ),
      { {} },
      ( s, c ) => s & List.Transform ( s, ( x ) => x & { c } )
    )
  ),
  expand = Table.ExpandListColumn ( addComb[[comb]], "comb" ),
  addCount = Table.AddColumn ( expand, "КолЭл", each List.Count ( [comb] ), Int64.Type ),
  parameters = Record.FromTable (
    Table.FromColumns ( Table.ToColumns ( Excel.CurrentWorkbook(){[ Name = "parameters" ]}[Content] ), type table [ Name = text, Value = number ] )
  ),
  filterElements = Table.SelectRows (
    addCount,
    each [КолЭл] = Record.FieldOrDefault ( parameters, "Количество элементов в сочетании", null )
  ),
  toRec = Table.TransformColumns ( filterElements, { "comb", ( x ) => Record.FromList ( x, List.FirstN ( clmnNames, List.Count ( x ) ) ) } ),
  group = Table.Group ( toRec, { "comb", "КолЭл" }, { { "Повт", each Table.RowCount ( _ ), Int64.Type } } ),
  filterRepeats = Table.SelectRows ( group, each [Повт] >= Record.FieldOrDefault ( parameters, "Минимальное число повторений", null ) ),
  sort = Table.Sort ( filterRepeats, { { "КолЭл", Order.Descending }, { "Повт", Order.Descending } } ),
  expandRecs = Table.ExpandRecordColumn ( sort, "comb", List.FirstN ( clmnNames, sort[КолЭл]{0} ) )
in
  expandRecs

 
Мария Гончарова, вы бы в примере хоть исходные данные в шаблоне бы заполнили. что там за данные и что там за фильтр?
Вот горшок пустой, он предмет простой...
 
PooHkrd, за ТС пример свой же дам :)
Из каждой строки берем уникальные элементы. Находим все сочетания.
Далее находим для каждого сочетания число повторений в разных строках.
Изменено: surkenny - 14.01.2022 18:36:29
 
Буфферизация предпоследнего шага ускоряет выполнение в ~2 раза:
Скрытый текст
 
Цитата
написал:
Мария Гончарова , вы бы в примере хоть исходные данные в шаблоне бы заполнили. что там за данные и что там за фильтр?
Извиняюсь, отлучилась. Исходные данные любые. surkenny уже за меня скинул пример :D  С большим количеством столбцов, у меня вообще не работает. Приложу 2 примера. В одном 2 строчки по 20 столбцов с рандомными числовыми значениями. И в фильтре указало повторения 10 с количеством повторений минимум 2. Вообще не ищет. Во втором примере, строчек 19 по 16 столбцов так же с числами. В фильтре указала количество повторений 6. Всё ищет. Причем, можно и 20 строчек указать. И 200000. Именно когда столбцов много, не думает вообще. Пк так же не нагружается. Вроде в настройках указано многопоточность 16, но без толку. Или это дело pq?
Страницы: 1
Наверх