Развертывание приложения на защищенном сервере; загрузите данные один раз и сделайте их доступными для нескольких пользователей / сеансов

# load data once and make readily available to multiple users/sessions

Вопрос:

Я разрабатываю блестящее приложение, которое развертывается на блестящем сервере через виртуальную машину. Это приложение для анализа данных. Данные извлекаются из базы данных через ODBC, для чего я использую RODBC библиотеку.

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

Первый подход: извлечение данных за пределы кода сервера

 library(shiny)
library(DT)
library(RODBC)
library(dplyr)

#creating the driver connection variable
conn<-odbcConnect("<name of ODBC driver that I am using>")

#the sql query for pulling the data from the database
sql<- "SELECT * FROM <name of database>"

#retrieving and creating the dataframe
df<-sqlQuery(conn,sql)

#data wrangling sequence takes place
df%>%
...
...
...

ui<-fluidPage(
#rest of ui
...
)

server<-function(input, output,session){
#rest of server
...
}

shinyApp(ui,server)
 

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

Второй подход: извлечение данных внутри кода сервера

 ui<-fluidPage(
#rest of ui
...
)

server<-function(input, output,session){
# have the data retrieval process in the server
#creating the driver connection variable
conn<-odbcConnect("<name of ODBC driver that I am using>")

#the sql query for pulling the data from the database
sql<- "SELECT * FROM <name of database>"

#retrieving and creating the dataframe
df<-sqlQuery(conn,sql)

#data wrangling sequence takes place
df%>%
...
...
...

#rest of server
...
}

shinyApp(ui,server)
 

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

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

Это первое приложение, которое я развернул на сервере, поэтому мне нужны некоторые указания. Что мне нужно сделать, чтобы данные вызывались один раз, а затем были готовы для пользователей, как только к приложению обращается новый пользователь?

Большое спасибо 🙂

Ответ №1:

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

Вот объяснение правил определения области действия для приложений Shiny.

Другим решением, поскольку ваши данные все время кажутся одинаковыми, является извлечение данных вручную и сохранение их в локальном файле. Затем просто загрузите данные внутри server из локального файла, это будет быстрее, чем доступ к БД.

Комментарии:

1. Спасибо за эти предложения Geovany! Что касается global.R файла, я могу поместить в него код, который я использую для доступа к БД, а затем поместить его за пределы сервера, правильно? Как в ссылке, которую вы включили в свой ответ source('all_sessions.R', local = TRUE) ?

2. Вам не нужен source... код, который уже global.R есть, весь код будет выполнен один раз, и он будет доступен для всех сеансов. Вы можете включить дополнительный код в отдельные файлы с помощью source . Если вы используете исходный код внутри global.R , он будет доступен во всех сеансах.