# 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
, он будет доступен во всех сеансах.