R Shiny 加速数据加载

Posted

技术标签:

【中文标题】R Shiny 加速数据加载【英文标题】:R Shiny Speed Up Data Loading 【发布时间】:2015-12-18 19:57:12 【问题描述】:

我有一个 Shiny 应用程序,需要先加载一个 .RData 文件。 .RData 文件只有一个大文件,它有 2800 万行和 25 个变量。由于文件很大,Shiny 页面需要超过 2 分钟才能显示出来。我们可接受的加载时间在 30 秒内。有人对如何加快加载有任何建议吗?

我确实尝试通过 fread 函数(来自 data.table pkg)加载数据,但仍然需要 2 分钟以上才能加载。我猜 load(.RData) 还是比 fread(.csv) 快?

谢谢!

【问题讨论】:

你真的需要下载那么多吗?您能否在上传之前进行总结/汇总? @MLavoie 不幸的是,我必须这样做,因为 Shiny 页面是为了让人们能够探索我们拥有什么样的数据。但是,文件很大,因为我将几个数据文件合并并融合在一起。也许我可以上传它们并在服务器上进行转换。 你不会比fread 快多少,除了readRDS(这只是一个猜测)。我真的怀疑您是否需要将所有数据存储在内存中才能“探索”它。你可以把它放在一个数据库中,然后在闪亮的应用程序中只提取它需要的部分。 如果你有 2800 万行,我不确定 Shiny 是否适合探索数据 :-) 您可以延迟加载整个数据集,方法是仅加载您需要配置流程(类别、字段名称等)的数据,这些数据可以作为单独的数据结构提供。用户界面也会加载得更快 【参考方案1】:

不要使用压缩 - 如果你有快速磁盘并且变量是数字的,那么使用未压缩的 RDS 比压缩快得多:

> l = lapply(1:25, function(o) rnorm(28e6))
> names(l) = paste0("V",1:25)
> attr(l,"row.names") = .set_row_names(length(l[[1]]))
> class(l) = "data.frame"
> saveRDS(l, file="data.rds", compress=FALSE)

(新会话)

> system.time(d<-readRDS("data.rds"))
   user  system elapsed 
  6.474   2.091   8.576 
> dim(d)
[1] 28000000       25

也就是说,这对于Rserve 来说似乎是一个很好的用例,您可以在其中预加载数据,这样当用户连接时,所有会话都已加载和共享数据(假设您没有运行 Windows 服务器) .

【讨论】:

感谢您的回答。我确实尝试了您的建议,但仍然需要 60 多秒。我猜是因为该文件包含多种数据类型(数字、字符、日期)。最终我最终导入了几个小块,然后使用 data.table 包将它们合并在一起。它有 allow.cartesian=TRUE 所以文件变大但速度很快。我能够将速度降低到 15 秒。

以上是关于R Shiny 加速数据加载的主要内容,如果未能解决你的问题,请参考以下文章

导入文件并附加到 r shiny 中先前加载的文件

在 R Shiny 中闪烁加载文本

从使用 devtools 加载的包中设置 ReferenceClass 时,R 中的 Shiny 出错

部署 R Shiny 应用程序时加载包时出现问题

根据文件选择保存和加载用户选择 - R Shiny

带有 if 语句的 ReactiveTimer R-Shiny