Сделал обработку которая делает запросы к 4 разным листам в одной книге + 1 запрос к отдельному файлу (к источникам всего 5 запросов) Запросы обращаются не напрямую к файлу, а к папке, нужный файл я выбираю на сл.шаге через фильтр. Затем идет еще 6 запросов (5 последовательных слияний и последний 6 запрос, который выводит итоговые данные на лист) У меня обработка работает отлично, а у коллеги которому делал - срабатывает только после обновления всех запросов поочередно вручную (и то через раз), иначе запрос крутиться в бесконечном цикле обновления, при этом не происходит пересчета обработанных мегабайт, как обычно бывает. Версии MS Office одинаковые (2019), источники весят не более 5 мб совместно. Источники по кол-ву строк/столбцов - не более 3000/156. Все запросы - только подключение, кроме последнего. Выгрузка в модель данных не делается.
С чем может быть связана проблема? Может нежелательно обращаться одновременно к разным листам одной книги? Например если открыть источник при обновлении запроса, то в запрос выдает ошибку доступа, может нужно/можно как-то задать очередность обращений? Может разделить Листы в источнике на отдельные файлы? Может вообще в CSV!!!?? с последними ни когда не было проблем... В умные таблицы преобразовывать нельзя (долго объяснять)
Обычно если Power Query начинает тупить, то виноват net.framework. Переустановите его на более свежий. Или вдруг он вообще не установлен. И потом попробуйте.
Спасибо за советы. Эта галка стояла. Снял. Протестил на своем домашнем и рабочем ПК. У меня все работает как и раньше. В среду буду тестить с коллегой.... net.framework - попробую, спасибо.
Приветствую всех. После снятия галки у коллеги все заработало! И это с учетом того, что добавилось еще 4 запроса два источника)) Огромное спасибо! Как эта галка влияет? При каких сценариях ее лучше снимать? Может всегда? Или только на слабых пк?
mikhailov, при создании новой книги эта галка всегда по умолчанию включена, поэтому при создании нового инструмента всегда первым делом отключаю её. Аналогично при создании нового проекта в PBI. Там та же проблема.
Цитата
mikhailov написал: Может нежелательно обращаться одновременно к разным листам одной книги?
Так как вы описали делать не желательно, при определенных условиях (выгрузка результатов двух таблиц одной книги в разные таблицы модели данных) может все вообще поломаться. Самое правильное это прочитать файл один раз при помощи File.Content, на выходе у вас будет бинарник, его запихиваем в Binary.Buffer (если его размер не более 200 Мб), а уже из оперативки считываем список листов и их растаскиваем по разным запросам. Так и работать будет сильно быстрее и проблем с одновременным доступом к файлу не будет.
Идея понятна. Не знал что так можно. Потренируюсь на своем текущем примере. Спасибо.
Интересно, а в запросе можно седлать так: вот я знаю, что в столбце № 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 )
Спасибо, все же хочу уточнить тк в вопросе плаваю.
Правильно так?: 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 уже не хватает...
Потому что тогда буфферизация будет происходить только в рамках конструкции let ... in. Переменная Источник не будет видна для других запросов. Все запросы видят только последний шаг, который вы объявляете после in, в вашем случае это переменная СодержимоеКниги, но она то как раз в памяти не сохраняется. Что будет происходить при таком развитии событий? Допустим 5 запросов будут обращаться к запросу ИсхЛог, тогда каждый из них будет "видеть" шаг СодержимоеКниги, обращение к нему запустит данный запрос 5 раз, т.е. 5 раз будет происходить считывание с диска, потом 5 раз помещение в память. Если же этот шаг из запроса убрать, то считывание с диска и помещение в память произойдет только при первом обращении, все остальные разы будут брать данные из памяти. Все вышеописанное не касается случая когда каждый из пяти запросов будет вываливать свой результат в отдельную таблицу на листе или в модели данных. Тогда никакой буфер не поможет каждый запрос, который выводит какой-то результат рассчитывается отдельно ото всех остальных.