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 加速数据加载的主要内容,如果未能解决你的问题,请参考以下文章