Пользовательские скрипты: быстрее, дешевле, лучше!

15 советов по созданию лучших скриптов и более отзывчивых запросов

Вы используете Sentinel Hub API? Вы хотите улучшить свои сценарии evalscripts, сэкономив время и деньги на обработку?

С расширенными пользовательскими скриптами важно писать понятный и эффективный код. Когда на счету каждая секунда обработки, важна каждая строка кода. Это сообщение в блоге даст вам несколько советов о том, как писать эффективные сценарии evalscripts (пользовательские сценарии). Это также даст представление о возможных вариантах использования сценариев вычислений, которые на первый взгляд не обязательно очевидны.

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

В Sentinel Hub мы постоянно стремимся сократить время обработки при одновременном повышении гибкости. Мы хотим поделиться с вами лучшими советами от нашей команды экспертов, которые, надеюсь, помогут вам писать более быстрые скрипты.

Совет 1. Избегайте карты! Используйте циклы FOR

Этот большой, потому что может значительно ускорить выполнение даже одного запроса.

Используйте циклы for вместо функций javascript .map, .reduce, .filter, .find в ratingPixel. При использовании этих функций ваше приложение может работать заметно медленнее. Хотя они могут быть удобными, они не быстрые. А для очень простых функций карты даже цикл for может быть избыточным, так как можно явно вычислить значения для каждого компонента.

Кроме того, избегайте foreach, поскольку циклы for все еще быстрее.

Падение производительности может быть значительным!

Избегайте:

Do:

Или даже в этом простейшем случае:

Совет 2: запрашивайте то, что вам нужно

Не запрашивайте большую площадь, чем вам действительно нужно. Точно так же ввод большего временного диапазона, чем необходимо для временных запросов, потребует больше времени для обработки и использования большего количества единиц обработки. Временные запросы могут легко выйти из-под контроля, так как данных доступно ОЧЕНЬ много. Если не уверены и если возможно, подумайте о тестировании с минимальными полосами и минимальными сценами на минимальной площади, прежде чем запускать джаггернаут.

Совет 3. Удалите неиспользуемый код

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

Совет 4. Рассчитывайте по мере необходимости

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

Избегайте:

Do:

Совет 5: избегайте лишних входных полос

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

Совет 6. Избегайте ненужных форматов вывода

В некоторых случаях в выходном изображении нет необходимости. Если вы оказались в такой ситуации (например, если вам нужны только какие-то метаданные), установите количество выходных каналов равным нулю, чтобы вам не приходилось иметь дело с изображением.

Совет 7. Выводите меньшие форматы

Если вам не нужен большой выходной формат, такой как float32, рассмотрите возможность использования UINT16 или даже меньшего, UINT8. Подробнее о форматах вывода здесь.

Совет 8. По возможности используйте цифровые числа

Для Sentinel-2 цифровые числа делятся на 10 000, чтобы получить коэффициент отражения. Если вы хотите рассчитать нормализованные индексы разности для оптических диапазонов, например NDVI, масштабирование уместно. В таких случаях имеет смысл использовать в качестве единиц цифровые числа (DN). Это будет происходить немного быстрее, так как преобразования отражательной способности можно будет избежать. Подробнее о функции настройки здесь.

Кроме того, запрос данных UINT16 цифровых номеров Sentinel-2 несет ту же информацию, что и данные FLOAT32, но требует меньшего количества единиц обработки и требует меньшей полосы пропускания (следовательно, быстрее).

Совет 9: используйте глобальные переменные

Вы можете установить глобальные переменные в evalscript, к которым вы можете получить доступ / изменить в AssessmentPixel (или любой другой функции). Это полезно, например, для вычисления базовой статистики. Это не снижает производительности и не приносит пользы, мы просто хотели бы отметить, что это возможно.

Совет 10: используйте визуализаторы

Визуализаторы - это удобные классы, которые вы можете использовать для управления визуализацией в ваших скриптах. Доступно несколько типов. Поскольку они оптимизированы, они должны работать быстрее, чем пользовательская функция (насколько мы не можем сказать, поскольку это зависит от функции).

Вы можете использовать визуализаторы с двумя разными функциями:

  • viz.process (value) i используются при работе только с одним значением / диапазоном
  • viz.processList (valueArray) используется при работе с несколькими значениями / диапазонами. (Доступность этого зависит от визуализатора)

Например:

Совет 11. Используйте стандартные продукты

Многие визуализации уже доступны как предопределенные продукты в Конфигураторе уровня Sentinel Hub. Мы вносим в них улучшения по мере необходимости, и в некоторых случаях использование предопределенного продукта будет быстрее, чем его соответствующая версия evalscript. Это связано с тем, что мы можем дополнительно оптимизировать обработку часто используемых фиксированных продуктов. Проверьте конфигуратор, возможно, интересующая вас визуализация уже есть.

Обратите внимание, что вам следует выбрать вариант «установить продукт» вместо «копировать в редактор сценариев», чтобы получить все последние обновления.

Совет 12: используйте один запрос для нескольких визуализаций

Предположим, вас интересуют визуализации области с использованием псевдоцвета и NDVI. Для ложного цвета соответствующие полосы Sentinel-2 - B08, B04 и B03. Для NDVI вам понадобятся диапазоны B08 и B04. Если вы запрашиваете визуализации отдельно, вы используете два запроса, каждый из которых получает полосы B08 и B04. Вместо этого вы можете вернуть оба сразу, указав выходы для обоих в одном запросе.

Для этого сначала в объекте output в setup укажите оба выхода, указав им идентификаторы, количество выходных каналов и тип образца. Затем в разделе valuPixel верните оба выхода, указывающие на их соответствующие идентификаторы, указанные выше. Полный запрос на NDVI можно найти здесь.

Совет 13: используйте маски данных

Скрипты Evalscripts выполняются для каждого пикселя, независимо от исходных данных. Действительный или недействительный пиксель будет обработан. Если ваш evalscript требует больших вычислительных ресурсов, рассмотрите возможность добавления dataMask и пропуска обработки без данных. Обратите внимание, что вы можете использовать dataMask только со сценариями evalscripts Версия 3.

Совет 14: фильтруйте свои сцены

Используйте filterScenes, чтобы дополнительно отфильтровать сцены, которые входят в ваш сценарий evalscript. Это полезно, например, если вы хотите сравнить два изображения, но не знаете, когда именно они были получены. Можно использовать более длинный временной диапазон, и затем filterScenes может удалить все, кроме двух. Такой evalscript не только загрузится быстрее, но и будет использовать меньше процессоров, поскольку лишние ненужные сцены больше не загружаются.

Совет 15. Прочтите документацию, посмотрите примеры

Мы понимаем, что использование пользовательских скриптов может оказаться довольно сложной кривой обучения. Evalscripts невероятно эффективны, и объяснить все в одном сообщении в блоге просто невозможно.

Поэтому мы приглашаем вас посетить нашу постоянно улучшающуюся документацию по evalscript и страницы с примерами. Они написаны нами и представляют собой различные передовые методы работы с Evalscripts. Мы надеемся, что они помогут вам ускориться, не вызывая перегрузки, и станут отправной точкой для сценариев и запросов, которые можно изменить в соответствии с вашими конкретными потребностями.

Наконец, если вы еще не видели, второй Конкурс пользовательских сценариев Sentinel Hub в настоящее время продолжается! Мы надеемся, что эти советы вам пригодятся, и не забудьте прислать свои лучшие сценарии, чтобы получить шанс выиграть привлекательные призы!

Удачного сценария!