js json过滤_如何在浏览器不崩溃的情况下过滤 200 万行数据?

2ac13c86685acea6a80c98505a3695fb.png

最近我分配到了一个非常有趣的任务:在前端显示 1GB 文件和 200 万行数据,并实现过滤,在这篇文章中,我将分享我是如何完成这个任务的。

背景

我曾经创建了一个简单的 React 应用程序。这个应用程序从服务器加载一些数据,并呈现在几个表格中。在成功演示了 React 应用程序后,客户授权我访问生产数据。然后,有趣的事情发生了。当我将应用程序从开发 API 连接到生产环境并重新加载页面时,看到了类似“显示此网页时出现问题”的错误。经过调试,我发现生产服务器的 JSON 文件大小约为 500MB(而不是从开发服务器的 2 到 5 MB)。

最新的需求是:

1.JSON 文件最大可达到 1 GB。

2. 后端不会进行分页——只能接受这个事实。

首先,我尝试了 react virtualized,一个 React 组件,可以通过虚拟渲染有效地渲染大型列表。

但几天后又出现了新的需求:

3.“标准的浏览器搜索(Ctrl/Cmd + F)功能无法正常工作,必须修复这个问题!”

虚拟列表背后的主要思想是只渲染可见的内容。因此,如果用户在搜索框中输入一些东西,那么浏览器只会搜索虚拟列表的可见部分。

下图演示了浏览器是如何搜索虚拟列表的。请注意,滚动后出现的记录(虚拟列表进行了重新渲染)没有高亮显示,尽管包含了要搜索的值“@”。

10a136abe63252a2ee7688b5faf27328.gif

搜索框

我决定创建一个具有类似默认浏览器搜索功能的自定义搜索框,但可以搜索所有的 200 万条记录。

对大量数据进行过滤操作会导致“堆内存不足”。截至 2018 年 4 月,我没有找到任何提供内置搜索 / 过滤功能的 React 虚拟列表实现。

经过几个小时的谷歌搜索和在 Stack Overflow 网站上提问之后,我想到了 Web Worker,并使用了Simple Web Worker 库。这个方法的主要思想是将一个大数组拆分成更小的部分,并使用 Web Worker 异步处理每个部分。

找到最佳的块长度是很有必要的。块的长度越短搜索速度就越慢,但长度越长,在低配置设备上出现“堆内存不足”的可能性就越大。在我的例子中,根据实验结果,3000 是最佳长度。

华丽制胜

下图演示了自定义搜索框。在发生滚动后,高亮显示不会消失,用户可以通过箭头按键在行和表之间导航。是的,过滤数据确实需要一些时间,但它可以处理比之前更多的信息。为简单起见,数组只包含了 9000 个项,但可以随意添加,不过过滤时间也会随之增加(过滤 200 万行可能需要 5-7 分钟)。

7aa4dcf98969d95cca561a95dc083a67.png

这种方法帮助我解决了几个问题:

  • 过滤大量数据而不会导致浏览器崩溃。在我的例子中,文件的最大大小约为 1GB,最多有约 200 万行数据。
  • 创建一个搜索框,提供与原生浏览器搜索类似的 UX,可以搜索所有 200 万行数据。

你可以在这里找到应用程序的源代码:

https://github.com/uptechteam/react-filter-demo

演示:https://uptechteam.github.io/react-filter-demo/

解决方案简短描述

这个 React 应用程序包含 3 个组件:

  • App.js——应用程序的主要组件;
  • SearchBox.js——实现搜索框功能的组件,使用箭头按键导航搜索结果;
  • TablesViews.js——渲染结果表格的组件,它演示了如何在表格之间实现 SearchBox 导航。

英文原文:

https://blog.uptech.team/https-medium-com-oleksii-kryvonosov-how-to-filter-1gb-json-on-the-frontend-and-not-crash-the-browser-ff59ebeb1baa

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/486934.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

联合国旗舰报告《全球生物多样性展望》发布:面对最糟糕的生物多样性保护成绩单,人类该何去何从?...

来源:阿拉善SEE公益机构2020年9月15日 ,联合国《生物多样性公约》(CBD)发布了一份重量级的旗舰报告——第五版《全球生物多样性展望》(Global Biodiversity Outlook 5)。该报告显示,CBD于2010年…

function函数嵌套 matlab_MATLAB嵌套函数

嵌套函数的定义嵌套函数,即nested function,就是嵌套在函数体内部的函数。嵌套函数可以出现在一个函数体内部的任何位置,开始以function声明,结束的时候加上end。需要说明的是包含有嵌套函数的函数,无论它是主函数、子…

Java 代码复用 —— 泛型

public interface Comparable<T> {public int compareTo(T o); } 1. 接口&#xff08;Comparable&#xff1a;可比较接口&#xff09; public static boolean less(Comparable v, Comparable w) {return v.compareTo(w) < 0; } 当然也可以将参数中的 Comparable 具化为…

阿里云发布首台云电脑“无影”,传统 PC 已“末路”?

来源 | 硬核编辑部作者 | 硬核云顶宫在9月17日的云栖大会上&#xff0c;阿里云智能总裁、达摩院院长发布阿里云第一台云电脑——“无影”。这是一台长在云上的“超级电脑”&#xff0c;只需将一张名片夹大小的 C-Key 上连接一块屏幕&#xff0c;就可以进入专属云电脑桌面&#…

金星可能存在生命?科学家发现大气中有磷化氢,剧毒气体或是生物代谢产物...

文章来源&#xff1a;量子位最新消息&#xff0c;英国皇家天文学会发布了一条激动人心的新进展&#xff1a;金星上可能存在着生命迹象。因为科学家发现&#xff0c;金星大气中存在着浓度异常的磷化氢(PH3)气体&#xff0c;达到20ppb&#xff08;亿分之二&#xff09;。这种剧毒…

python怎么输入两个数然后求差值_python两个日期之间天差值获取

因为我也刚刚接触python&#xff0c;这个原则上也是百度找到的&#xff0c;原来那位我也找不到了......主要就是使用datetime进行转化然后进行相减&#xff0c;获得如[diff_days] : 00:00:00形式的结果&#xff0c;这里我是把结果转成string去做截取了。需要引入time,datetime两…

php简单的用户留言板实现内容(1-23)

静态模版来源 可视化布局 代码实现 <?php header(content-type:text/html;charsetutf-8); date_default_timezone_set("Asia/Shanghai"); /*构思&#xff1a;建立一个文本文件&#xff0c;通过操作文件&#xff0c;写入数据、读取数据&#xff01;file_get_conte…

3D芯片大脑:在芯片上培养脑细胞,还能用来测试新药

来源&#xff1a;MEMS在科学实验中&#xff0c;研究人员往往首先以小白鼠为实验对象。虽然是科研需要&#xff0c;但有人谴责这是对生命的亵渎。此外&#xff0c;动物测试成本高且耗时&#xff0c;同时无法精确体现人类的反应。那么有没有其他替代品呢&#xff1f;来自劳伦斯利…

mysql install安装报错_mysql安装报错

错误1make: *** No targets specified and no makefile found. Stop.1、wget http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.6.tar.gz2.、tar zxvf ncurses-5.6.tar.gz3、 ./configure -prefix/usr/local -with-shared-without-debug4、make5、make install报错2&#xff1a;I…

Linux中几个实用快捷键

返回上层目录&#xff1a; cd ..命令提示符&#xff1a; userubuntu&#xff1a; 之前的部分为当前用户ID名称&#xff1b; 之后冒号之前是主机名称sudo &#xff1a;&#xff08;Superusers Do&#xff09; 以超级用户执行在相对路径中&#xff0c; . 表示当前目录&#xff0…

68个单位134项 | 2020年国家自然科学基金专项项目立项名单发布

来源&#xff1a;自然科学基金委、青塔9月17日&#xff0c;国家自然科学基金委基金查询系统公布了2020年专项项目立项名单。本年度专项项目共立项134项&#xff0c;来自68个单位。其中&#xff0c;北京大学立项项目数量、金额均最多&#xff0c;共9项&#xff0c;合计资助金额1…

mysql atlas php_Mysql中间件代理 Atlas

本文接上文介绍atlas的安装配置&#xff0c;以及借助keepalive软件实现altas的ha&#xff0c;避免由于atlas故障&#xff0c;导致数据库服务中断的情况出现&#xff1a;一&#xff1a;环境介绍Atlas主&#xff1a;192.168.1.12/# yum -y install openssl openssl-devel# wget h…

灵魂出窍的神经生物学基础!

来源&#xff1a;孙学军科学网博客过量使用氯胺酮&#xff0c;会导致使用者出现幻听幻象&#xff0c;甚至灵魂出窍的感觉。这种灵魂出窍的感觉在学术上被成为分离麻醉&#xff0c;常被描述为感觉脱离现实或有一种“脱离身体”的体验。这种现象不仅见于服用氯胺酮&#xff0c;也…

基于mycat的mysql_基于mycat实现mysql的读写分离

需要具备以下环境1 mysql主从复制2 jdk安装以及环境变量配置以下为我的演示参考&#xff1a;192.168.142.26 master- mysql 具备主从主从复制条件192.168.142.25 slave- mysql 具备主从主从复制条件192.168.142.27 slave- mysql 具备主从主从复制条件192.168.142.28 myca…

linux wget 命令用法详解(附实例说明)

来源&#xff1a;http://www.jb51.net/LINUXjishu/86326.html Linux wget是一个下载文件的工具&#xff0c;它用在命令行下。对于Linux用户是必不可少的工具&#xff0c;尤其对于网络管理员&#xff0c;经常要下载一些软件或从远程服务器恢复备份到本地服务器。如果我们使用虚拟…

uniapp中复选框的使用

当在uniapp中使用复选框时&#xff0c;可以使用<checkbox>组件来实现。首先&#xff0c;在需要添加复选框的页面或组件中引入<checkbox>组件&#xff0c;在需要添加复选框的位置使用<checkbox>标签&#xff0c;并设置相应的属性&#xff0c;比如v-model来绑定…

《WeCity未来城市2.0白皮书》全文发布

全文共计899字60图&#xff0c;预计阅读时间12分钟来源 | 腾讯研究院&#xff08;转载请注明来源&#xff09;编辑 | 石煜倩新基建浪潮之下&#xff0c;新型城镇化的建设正在加速&#xff0c;这为数字技术与经济社会融合带来了更多的想象空间&#xff1b;同时后疫情时代&#x…

bzoj5108 数据_成都day3t3

3 、B B 君的第 三 题 ( shanghai .pas /cpp )【问题描述】日光之下&#xff0c;并无新事。大家还记得 BZOJ1494[NOI2007]生成树计数吗&#xff1f;这个题目就是原版环形的生成树计数。考虑到有些同学没有看过这个题目&#xff0c;我们简述这个题目如下。输入 k, n(n ≥ 2k 1…

20165333 我期望的师生关系

20165333 我期望的师生关系 印象深刻的老师 印象中小学老师的教学模式和方法大都是上课讲课&#xff0c;下课批改作业&#xff0c;一般无二&#xff0c;没有印象深刻的老师。一直记得初中时教我英语的赵老师&#xff0c;那时学校要求每天晚自习前学生上台一分钟演讲&#xff0c…

杨振宁:理论物理的工作是“猜”,而数学讲究的是“证”

文章 | 数学传播来源 | 算法与数学之美杨振宁是当代的大物理学家&#xff0c;又是现代数学发展的重要推动者&#xff0c;他的两项巨大成就: 杨–密尔斯规范场和杨–巴克斯特方程&#xff0c;成为80年代以来一系列数学研究的出发点&#xff0c;其影响遍及微分几何、偏微分方程、…