it-swarm.com.ru

Тайм-аут сценария приложения Google ~ 5 минут?

Мой скрипт приложения Google выполняет итерацию файлов на диске Google, копирует и иногда перемещает файлы в другие папки. Скрипт всегда останавливается через 5 минут без сообщения об ошибке в журнале. 

Я сортирую десятки, а иногда и тысячи файлов за один прогон.

Есть ли какие-либо настройки или обходные пути?

23
Martin V.

Квоты

Максимальное время выполнения одного скрипта составляет 6 минут/исполнение
- https://developers.google.com/apps-script/guides/services/quotas

Но есть и другие ограничения, с которыми нужно ознакомиться. Например, вам разрешено только общее время выполнения триггера 1 час/день, поэтому вы не можете просто разбить длинную функцию на 12 разных 5-минутных блоков.

Оптимизация

Тем не менее, есть очень мало причин, почему вам действительно нужно потратить шесть минут, чтобы выполнить. У JavaScript не должно быть проблем с сортировкой тысяч строк данных за пару секунд. Вероятность того, что вы снизите производительность, - это вызовы в службы Google Apps.

Вы можете писать сценарии, чтобы максимально использовать встроенное кэширование, сводя к минимуму количество операций чтения и записи. Чередование команд чтения и записи происходит медленно. Чтобы ускорить выполнение сценария, считайте все данные в массив одной командой, выполните любые операции с данными в массиве и запишите данные одной командой.
- https://developers.google.com/apps-script/best_practices

Дозирующий

Лучшее, что вы можете сделать, это уменьшить количество обращений в сервис. Google позволяет это, разрешая пакетные версии большинства своих вызовов API. 

В качестве тривиального примера, Вместо этого:

for (var i = 1; i <= 100; i++) {
  SpreadsheetApp.getActiveSheet().deleteRow(i);
}

Сделай это:

SpreadsheetApp.getActiveSheet().deleteRows(i, 100);

В первом цикле вам нужно было не только 100 вызовов deleteRow на листе, но и 100 раз получить активный лист. Второй вариант должен работать на несколько порядков лучше, чем первый.

Переплетение читает и пишет

Кроме того, вы также должны быть очень осторожны, чтобы не переходить часто между чтением и письмом. Вы не только потеряете потенциальную выгоду в пакетных операциях, но и Google не сможет использовать встроенное кэширование.

Каждый раз, когда вы выполняете чтение, мы должны сначала очистить (зафиксировать) кэш записи, чтобы убедиться, что вы читаете последние данные (вы можете принудительно выполнить запись в кэш, вызвав функцию SpreadsheetApp.flush()). Аналогично, каждый раз, когда вы делаете запись, мы должны выбрасывать кеш чтения, потому что он больше не действителен. Поэтому, если вы сможете избежать чередования операций чтения и записи, вы получите полное преимущество от кэша.
- http://googleappsscript.blogspot.com/2010/06/optimizing-spreadsheet-operations.html

Например, вместо этого:

sheet.getRange("A1").setValue(1);
sheet.getRange("B1").setValue(2);
sheet.getRange("C1").setValue(3);
sheet.getRange("D1").setValue(4);

Сделай это:

sheet.getRange("A1:D1").setValues([[1,2,3,4]]);

Цепные вызовы функций

В крайнем случае, если ваша функция действительно не может завершиться менее чем за шесть минут, вы можете связать воедино вызовы или разбить свою функцию для работы с меньшим сегментом данных. 

Вы можете хранить данные в Cache Service (временная) или Properties Service (постоянная) корзина для извлечения между выполнениями (так как Сценарии Google Apps имеют выполнение без сохранения состояния).

Если вы хотите запустить другое событие, вы можете создать свой собственный триггер с помощью Trigger Builder Class или настроить повторяющийся триггер на жестком расписании.

41
KyleMit

Найдите способ разделить вашу работу так, чтобы это заняло менее 6 минут, поскольку это предел для любого сценария. На первом этапе вы можете выполнить итерацию и сохранить список файлов и папок в электронной таблице и добавить управляемый по времени триггер для части 2.

Во второй части удалите каждую запись в списке по мере ее обработки. Если в списке нет элементов, удалите триггер.

Вот так я обрабатываю лист из примерно 1500 строк, который распределяется по примерно дюжине различных электронных таблиц. Из-за количества обращений к электронным таблицам время ожидания истекает, но повторяется при повторном запуске триггера.

10
Fred

Я разработал библиотеку сценариев Google Apps, которая использует UserProperties и программные триггеры для запуска пакета, выходящего за пределы 6 минут. Вы можете импортировать эту библиотеку в свой проект GAS и обернуть свой код API, чтобы она могла работать FOREVER (ну, на самом деле, мы ограничены квотой, связанной с количеством часов, которые могут запускать триггеры)

Вы можете узнать все об этом здесь: http://patt0.blogspot.in/2014/08/continuous-batch-library-update-for.html

2
patt0

Если вы используете G Suite в качестве клиента Business, Enterprise или EDU, время выполнения скриптов устанавливается на: 

30 мин/исполнение

Смотрите: https://developers.google.com/apps-script/guides/services/quotas

0
ScottMcC

Если вы являетесь бизнес-клиентом, теперь вы можете подписаться на Ранний доступ к App Maker , который включает Гибкие квоты .

В рамках гибкой системы квот такие жесткие ограничения по квотам снимаются. Скрипты не останавливаются, когда достигают предела квоты. Скорее, они задерживаются до тех пор, пока не станет доступна квота, после чего выполнение скрипта возобновится. Как только квоты начинают использоваться, они пополняются по обычной ставке. При разумном использовании задержки сценариев редки.

0
browly