javascript - 从 elasticsearch 下载 300,000+ 行作为 .csv 文件
问题描述
您好,我在 nodejs 中有一个网站,在 Elasticsearch 中有一个数据库。索引“bigData*”有 366,844 行,每行有 25 个项目,每个项目是一个不同的字符串,大小不一,最大约为 100 个字符。我正在将此索引查询到我在页面上显示的数据表中,我使用滚动将元素逐渐加载到表中并将其显示在页面上。Datatables 有一个“全部下载”选项,但它只会下载页面上加载的内容。我正在尝试实现一个真正的“全部下载”,它将获取所有 366,844 行,将其编译成文件(csv),然后从网页下载。
我尝试使用滚动,就像它用来加载数据的方式一样,反复调用我的数据库以获取 10,000 行。每次耗时 30 秒,总共 20 分钟。
我知道这样的事情可能需要一些时间,我不期待即时解决方案。但我的方法也让 chrome 变得非常迟钝和缓慢,甚至一度几乎崩溃。有人推荐下载这么多数据吗?甚至可能是我的项目的 npm 包或库,可以在后台准备好下载。
谢谢
解决方案
这里有几件事:
- 当显示如此多的行时,您可能希望使用虚拟滚动来将 DOM 元素(
<tr>
,<td>
, ...)的数量保持在正常水平并防止滚动减速和卡顿。您使用的是 vanillaJS 还是某些框架?那里有一大堆虚拟滚动库。 - 如果 10,000 行需要 30 秒,则以较小的批次 (~200-500) 进行查询。当您的用户向下滚动时,另一个批处理查询将已被解析并可以呈现。
- 听起来您总是想下载所有 366,844 行——没有应用过滤器。如果是这种情况,除此之外,我会以合理的时间间隔执行S3 存储桶 csv 'dumps'(可能是每个备份都覆盖同一个文件),并将最新的文件直接链接到
<a href="..." target="_blank" >
. 这样,您的网站就会保持整洁,并且客户可以在自己方便的时候下载 CSV。
推荐阅读
- javascript - 在本机反应中将组件代码转换为钩子
- android - 焦点没有移出 RowsSupportFragment
- javascript - 从上传字段将图像添加到画布时,它被选中但隐藏在画布后面
- here-api - 使用 Tripadvisor oder Yielp 图片和评论增强此处的位置搜索结果
- android - OS12 上的 KeyStore 加密和解密与以前的版本
- mysql - “DESCRIBE”在 mysql 中给出语法错误
- php - 使用 Guzzle 将图像文件上传到 Strapi CMS API
- excel - 我无法使用命令按钮获取此用户表单来过滤颜色
- flutter - 脉冲动画按钮 Flutter
- swift - SwiftUI 如何使 ZStackView 适合设备视图