Страницы: 1
RSS
Несколько запросов PQ к разным листам одной книги
 
Сделал обработку которая делает запросы к 4 разным листам в одной книге + 1 запрос к отдельному файлу (к источникам всего 5 запросов)
Запросы обращаются не напрямую к файлу, а к папке, нужный файл я выбираю на сл.шаге через фильтр.
Затем идет еще 6 запросов (5 последовательных слияний и последний 6 запрос, который выводит итоговые данные на лист)
У меня обработка работает отлично, а у коллеги которому делал - срабатывает только после обновления всех запросов поочередно вручную (и то через раз), иначе запрос крутиться в бесконечном цикле обновления, при этом не происходит пересчета обработанных мегабайт, как обычно бывает.
Версии MS Office одинаковые (2019), источники весят не более 5 мб совместно. Источники по кол-ву строк/столбцов - не более 3000/156. Все запросы - только подключение, кроме последнего. Выгрузка в модель данных не делается.

С чем может быть связана проблема? Может нежелательно обращаться одновременно к разным листам одной книги? Например если открыть источник при обновлении запроса, то в запрос выдает ошибку доступа, может нужно/можно как-то задать очередность обращений?  Может разделить Листы в источнике на отдельные файлы? Может вообще в CSV!!!?? с последними ни когда не было проблем...
В умные таблицы преобразовывать нельзя (долго объяснять)
Изменено: vikttur - 26.08.2021 23:57:51
 
Обычно если Power Query начинает тупить, то виноват net.framework. Переустановите его на более свежий. Или вдруг он вообще не установлен. И потом попробуйте.
 
Эта галочка снята?
 
Спасибо за советы.
Эта галка стояла. Снял. Протестил на своем домашнем и рабочем ПК. У меня все работает как и раньше. В среду буду тестить с коллегой....
net.framework - попробую, спасибо.
 
Приветствую всех. После снятия галки у коллеги все заработало! И это с учетом того, что добавилось еще 4 запроса два источника))
Огромное спасибо! Как эта галка влияет? При каких сценариях ее лучше снимать? Может всегда? Или только на слабых пк?
 
Цитата
mikhailov написал:
При каких сценариях ее лучше снимать?
я снимаю ее всегда
Изменено: mechanix 85 - 05.04.2021 13:48:05
 
mikhailov, при создании новой книги эта галка всегда по умолчанию включена, поэтому при создании нового инструмента всегда первым делом отключаю её. Аналогично при создании нового проекта в PBI. Там та же проблема.
Цитата
mikhailov написал:
Может нежелательно обращаться одновременно к разным листам одной книги?
Так как вы описали делать не желательно, при определенных условиях (выгрузка результатов двух таблиц одной книги в разные таблицы модели данных) может все вообще поломаться.
Самое правильное это прочитать файл один раз при помощи File.Content, на выходе у вас будет бинарник, его запихиваем в Binary.Buffer (если его размер не более 200 Мб), а уже из оперативки считываем список листов и их растаскиваем по разным запросам. Так и работать будет сильно быстрее и проблем с одновременным доступом к файлу не будет.
Изменено: PooHkrd - 05.04.2021 15:26:43
Вот горшок пустой, он предмет простой...
 
Идея понятна. Не знал что так можно. Потренируюсь на своем текущем примере. Спасибо.

Интересно, а в запросе можно седлать так: вот я знаю, что в столбце № 3 всегда дата. Период 10 лет. А мне нужен для работы период - год. Можно не загружать все 10 лет, а заранее объяснить PQ, что столбец № 3 нужно обрабатывать как дату и из нее выбрать период - 2020 год?    
 
Если PQ лезет в таблицу, то для того чтобы отфильтровать что-то, он в любом случае должен считать её целиком.
Если нужно сократить объем считывания, то нужно разделить по годам именно файлы, и в названии файлов явно указать какой период внутри, далее запрос фильтрует сначала файлы по годам, а далее уже лезем внутрь того, который нужен.
Вот горшок пустой, он предмет простой...
 
Вопросов больше нет. Вообще-то их еще больше появилось)) Но не в рамках темы. Всем еще раз спасибо!
 
PooHkrd, доброго времени суток.
Вернулся к вопросу оптимизации обработки (там уже стало 11 запросов и у пяти из них в качестве источника - разные листы одной книги). У пользователей все работает и в текущем варианте, но...

Почитал форум и решил использовать следующую конструкцию:
Запрос 1 (имя запроса ИсхЛог)
Код
let
    Источник = Excel.Workbook(Binary.Buffer(File.Contents("C:\Обработки\Источник_логистика\ИсходныеЛогистика.xlsx")), null, false)
in
    Источник

Запросы 2,3, ... n (ниже начало всех последующих запросов, которые обращаются к разным листам одной книги ИсходныеЛогистика.xlsx)
Код
let
    Источник = ИсхЛог
in
    Источник

Насколько такая схема будет правильной для целей оптимизации?
Или нужно по-другому? Или можно лучше? Как?
 
mikhailov,
По другому, чтобы буферизация сработала, её результат нужно присвоить какой-либо переменной, для вашего случая правильно будет так:
Код
let
    Источник = Binary.Buffer(File.Contents("C:\Обработки\Источник_логистика\ИсходныеЛогистика.xlsx")),
    СодержимоеКниги = Excel.Workbook( Источник, null, false )
in
    СодержимоеКниги

При такой записи содержимое файла будет записано в оперативку и переменной Источник будет присвоена ссылка где оно там лежит, в результате при всех следующих обращениях к Источник файл будет считываться не с диска, а из памяти.
Соответственно если нужно чтобы на запрос из памяти ссылались другие запросы, то Excel.Workbook( Источник, null, false ) нужно из этого запроса убрать, а все остальные запросы начинать с этьой конструкции Excel.Workbook( ИсхЛог, null, false )
Изменено: PooHkrd - 19.04.2021 09:35:25
Вот горшок пустой, он предмет простой...
 
Спасибо, все же хочу уточнить тк в вопросе плаваю.

Правильно так?:
1) делаю первый запрос к файлу:
Имя запроса - ИсхЛог:
Код
let
    //делаем буферизацию
    Источник = Binary.Buffer(File.Contents("C:\Обработки\Источник_логистика\ИсходныеЛогистика.xlsx"))
in
    Источник
2) тогда в остальных запросах:
Код
let 
    Источник = Excel.Workbook(ИсхЛог, null, false)
in
    Источник



А почему нельзя вот так:
1) ИсхЛог:
Код
let
    //делаем буферизацию
    Источник = Binary.Buffer(File.Contents("C:\Обработки\Источник_логистика\ИсходныеЛогистика.xlsx")),
    //чтобы буферизация сработала, её результат присваиваем переменной СодержимоеКниги
    СодержимоеКниги = Excel.Workbook( Источник, null, false ) 
in
    СодержимоеКниги
2) остальные запросы получают данные так:
Код
let 
    Источник = ИсхЛог
in
    Источник

И можете подсказать какие книги почитать по теме. Базовых знаний по PQ уже не хватает...

 
Цитата
mikhailov написал:
А почему нельзя вот так:
Потому что тогда буфферизация будет происходить только в рамках конструкции let ... in. Переменная Источник не будет видна для других запросов. Все запросы видят только последний шаг, который вы объявляете после in, в вашем случае это переменная СодержимоеКниги, но она то как раз в памяти не сохраняется. Что будет происходить при таком развитии событий? Допустим 5 запросов будут обращаться к запросу ИсхЛог, тогда каждый из них будет "видеть" шаг СодержимоеКниги, обращение к нему запустит данный запрос 5 раз, т.е. 5 раз будет происходить считывание с диска, потом 5 раз помещение в память. Если же этот шаг из запроса убрать, то считывание с диска и помещение в память произойдет только при первом обращении, все остальные разы будут брать данные из памяти.
Все вышеописанное не касается случая когда каждый из пяти запросов будет вываливать свой результат в отдельную таблицу на листе или в модели данных. Тогда никакой буфер не поможет каждый запрос, который выводит какой-то результат рассчитывается отдельно ото всех остальных.
Вот горшок пустой, он предмет простой...
 
Спасибо! Суть стала понятна.
 
А какова м б причина долгого обращения к источнику даннных
Сознаны простые запросы к небольшим по размеру данным (строк по 100)

И при обновлении запросов происходит долгое обращение к источнику данных
Страницы: 1
Наверх