Ответ 1
Это очень интересный вопрос и заслуживает более правильных ответов, а не комментариев.
Я хотел бы рассказать о своем опыте и мыслях. Я создал коммерческое приложение R+shiny
с Shiny Server Pro, используя базы данных и множество других трюков.
Время загрузки отложенного пользовательского интерфейса
Мое приложение занимает более 30 секунд, чтобы загрузить, т.е. Вернуть управление пользователю.
Проблема
Shiny
- одностраничное приложение. Поэтому сложное приложение с множеством вкладок, загруженными для заполнения некоторых меню и селекторов и т.д., Начинается с начального времени загрузки.
UI возможные смягчения
- Используйте динамические компоненты пользовательского интерфейса (мудро), чтобы добавить сложность после запуска. Например, конкретное меню может начинаться очень просто с нескольких элементов, а затем добавлять дополнительные элементы на более позднем этапе.
- Джо Чэн предложил
insertUI
иremoveUI
, когда мое приложение было почти закончились, поэтому я не стал их использовать, но они также могли способствуют созданию более простой страницы для запуска.
Использование базы данных
Мое приложение использовало MonetDB
и позже PostgreSQL
. Производительность MonetDB
была хорошей, но у меня был конфликт с несколькими пользователями (сложная проблема, которую я не могу описать здесь), и это заставило меня перейти на PostgreSQL
в качестве альтернативы.
PostgreSQL
было хорошо, но для начала потребовалось драматическое время из-за проблемы с потерей кеша. Конструкция, необходимая для загрузки при запуске нагрузок данных в DB: плохая конструкция.
СУРБД задерживает возможные смягчения
Думаю, я пробовал большинство трюков с переменным успехом.
- Ограничение использования РСУБД. Поскольку я решил с самого начала использовать
data.table
для ускорить манипуляции данными без ограничений путем копирования, я также использовалfread
для любого типа чтения csv. В то времяfwrite
(еще отdata.table
) даже не был на горизонте, в противном случае это заслуживает серьезных соображений. - Реконструкция приложения. архитектура приложения имеет много общего со степенью
интенсивности, используемой СУБД. Я убежден, что время может быть
сохраненный дизайном, который может принимать во внимание
R+shiny
(главным образомR
) ограничения. - Теперь
MonetDB
имеетR
функции, встроенные в код, поэтому он должен быть даже быстрее, чем раньше. Это, безусловно, заслуживает хорошего взгляда. С другой вручную многопользовательские функции должны быть тщательно протестированы: большинство изR
код базы данных не учитывается для использования в многопользовательском режиме среды, предлагаемойShiny
. Может быть,RStudio
должен делать что-то еще об этом. Честно говоря, они уже начались, экспериментальное введениеconnection pools
, и это здорово.
Чрезмерное использование реактивности
Я думаю, что здорово играть с продвинутой инфраструктурой, например, Shiny
, и реактивность - это много интересного для изучения. С другой стороны, широкое и сложное приложение может легко выйти из-под контроля.
Чрезмерная реактивность возможных смягчений
- Отладка каждой функции дает точное представление о том, сколько раз
определенная функция
Shiny
, и любая реактивная функция называемых обычно более одного раза. Конечно, все это сжигает процессорное время, и требуется, по крайней мере, держать под контролем. - Конструкции типа
observeEvent
теперь имеют такие параметры, какignoreInit
: разумное использование этих параметров может сэкономить, по крайней мере, время инициализации.
По моему опыту мы только поцарапали поверхность того, что можно сделать с Shiny
. С другой стороны, существует предел из-за единственного процесса процесса R
. С помощью Shiny Server Pro
можно предусмотреть использование балансировщика нагрузки и распространение нескольких пользователей на разных серверах. С другой стороны, чтобы попасть на эти территории, нам понадобится какая-то система обмена сообщениями в разных случаях. Уже знаю, что я вижу необходимость этого в сложных приложениях Shiny Server Pro
(например, при необходимости управлять разными классами пользователей, но в то же время общаться между ними). Но это выходит за рамки этого вопроса SO.