使闪亮应用程序运行得更快的最佳实践是什么?

Apr*_*cot 22 r shiny

数据:

我有一个闪亮的仪表板应用程序,我的数据集大小约为600 MB.它每月膨胀100 MB.我的数据驻留在MySQL本地.

的MenuItems:

我的仪表板上有6到7个侧边栏menuItem,每个都有10-12个不同的输出 - 图表和表格.这些选项卡中的每一个都有3到6个输入,例如selectizeInput,滑块,日期范围等,以过滤数据.

数据子集:

由于我无法将所有数据加载到内存中,因此对于每个菜单项,我都会根据日期范围创建数据子集,方法是将日期范围保持为系统日期后的2-3天.

例如:

df1 <- reactive({df[df$date >- dateinput[1] & df$date <- dateinput[2], ]})

以上获取我的第一个菜单项的数据,并根据selectInput或其他输入,我进一步过滤数据.例如,如果我有一个selectInput Gender (male and female)然后我进一步子集df1到:

df2 <- reactive({
       if(is.null(input$Gender)){ 
          df1 
       } else if(input$Gender == "Male") 
          {df1[df1$Gender == "Male",]} 
       )}
Run Code Online (Sandbox Code Playgroud)

如果我有超过1个输入,我进一步将这个df1子集化并将值传递给df2.df2成为该MenuItem中所有图表和表的反应数据集.

menuItem的数量越多,我就会创建更多的子集以适应过滤器和分析.

我面临两个问题:

  1. 在较旧的计算机上,应用程序未加载.和
  2. 在较新的机器上,应用程序加载速度非常慢,有时为5-6分钟

在第一组数据加载后,图表和表在响应性更改时呈现得更快.

为了解决这个问题,我尝试将所有常见和重复的参数和库移动到global.R.

我有两个问题:

1.在R中挖掘数据时需要记住的任何基本卫生因素,特别是通过闪亮(R中的采矿速度非常快).

2.我已经阅读了关于并行处理的内容,但几乎所有的例子都谈到分配一个较重的计算.我们可以通过并行处理,分组数据或分发图表/表格准备来分发.

请注意,我是研究员而不是程序员,但他们已经学会在云上或最近在本地使用闪亮和主机应用程序.

对于像我这样的R的许多新手用户,这方面的指导将非常有用.

Enz*_*nzo 13

这是一个非常有趣的问题,应该得到更多适当的回答而不是评论.我想谈谈我的经历和想法.我R+shiny用Shiny Server Pro 构建了一个商业应用程序,使用数据库和其他技巧.

延迟的UI加载时间
我的应用程序需要超过30秒才能加载,即将控制权交还给用户.

问题

Shiny是单页面应用程序.因此,一个复杂的应用程序,带有大量标签,加载数据以填充某些菜单和选择器等受到影响,这从初始加载时间开始.

UI可能的缓解措施

  • 启动后使用动态UI组件(明智地)增加复杂性.例如,特定菜单可以非常简单地用很少的元素开始,然后在稍后阶段添加更多元素.
  • Joe Cheng建议insertUI,removeUI当我的应用程序差不多完成时,我没有使用它们,但它们也可以为更简单的启动页面做出贡献.

使用数据库

用我的应用程序MonetDB和以后PostgreSQL.性能MonetDB很好,但是我遇到了多个用户冲突(复杂的问题,这里我不详细说明),这迫使我转而PostgreSQL选择. PostgreSQL很好,但由于缓存预热问题,它花了很多时间才开始.在启动数据加载到DB时需要进行设计:糟糕的设计.

RDBMS延迟了可能的缓解措施

我想我尝试了大多数技巧并取得了不同的成功.

  • 限制RDBMS使用.正如我从一开始就决定使用data.table加速数据操作而不受复制限制,我也fread用于任何类型的csv读取.当时 fwrite(仍然是data.table)甚至没有出现在地平线上,否则值得认真考虑.
  • 应用程序重新设计.应用程序架构与使用RDBMS的强度程度有很大关系.我确信通过可以考虑R+shiny(主要R)限制的设计可以节省时间.
  • 现在MonetDB已将R函数嵌入到代码中,因此它应该比以前更快.它当然值得一看.另一方面,应该彻底测试多用户功能:大多数R 数据库代码没有考虑在多用户环境中使用shiny.也许RStudio应该做更多关于这个的事情.老实说他们已经开始了,实验性的介绍,connection pools这很棒.

过度使用反应性

我认为使用类似的高级框架非常棒shiny,而且反应性很有趣.另一方面,在广泛而复杂的应用程序中,事情很容易失控.

过度反应可能缓解

  • 调试每个函数可以精确地了解shiny调用特定函数的时间,并且通常不止一次调用任何反应函数.当然这一切都会耗费CPU时间,至少需要控制住.
  • observeEvent现在这样的构造具有如下参数ignoreInit:明智地使用这些参数可以在初始化时节省至少一个空隙循环.

根据我的经验,我们只是触及了可能的表面shiny.另一方面,由于单一工艺性质,存在限制R.通过Shiny Server Pro它可以设想使用负载平衡器并在不同服务器之间分布多个用户.另一方面,为了进入这些领域,我们需要在各种实例中使用某种消息传递系统.我已经知道在复杂的Shiny Server Pro应用程序中需要这样做(例如,当需要管理不同类别的用户,但同时在它们之间进行通信时).但这超出了这个SO问题的范围.