数百万行的JavaScript数据网格[关闭]


225

我需要使用JavaScript在网格中向用户呈现大量数据行(即数百万行)。

用户不应一次看到页面或仅查看有限数量的数据。

相反,应该看起来所有数据都可用。

并非一次下载所有数据,而是在用户访问时下载小块(即,通过滚动网格)。

这些行不会通过此前端进行编辑,因此可接受只读网格。

对于这种无缝分页,存在哪些用JavaScript编写的数据网格?


1
我不接受jqgrid答案,因为对于大型数据集来说,它似乎失败了……还有其他建议吗?什么ext-livegrid.com
Rudiger

6
自己写。我敢肯定,其他人会cho之以鼻,因为他们只是一直追加到DOM。我认为您将需要一种解决方案,当它们屏幕上滚动,这些行将被删除。那是唯一的方法。您根本无法在DOM中拥有一百万个表行,并且希望每个浏览器都能在每种环境中无缝显示和滚动。合理一点
乔什·斯托多拉

2
@Rudiger:SlickGrid现在原生支持无限数量的行。见github.com/mleibman/SlickGrid/tree/unlimited-rows。一旦对此进行了彻底的测试,它将被合并到主分支中。

10
我很抱歉您为哪一家公司工作。仅供参考,一个1920x1080的屏幕仅显示一百万行,滚动条上每移动一个像素,屏幕就会跳出20行。去做一些可用性测试,而不是浪费时间。
史密斯卧铺

2
这个问题及其最重要的两个答案(至少)非常有用。它可能吸引了一些低质量的答案,但是决不应该关闭此问题。如果人们尝试自己重新实现此功能,那么使用SlickGrid解决此问题可以为人们节省许多时间和麻烦的代码。
山姆·沃特金斯

Answers:


190

免责声明:我是SlickGrid的作者

更新 现在已在SlickGrid中实现。

请参阅http://github.com/mleibman/SlickGrid/issues#issue/22,以获取有关使SlickGrid与大量行一起工作的正在进行的讨论。

问题在于SlickGrid不会虚拟化滚动条本身-可滚动区域的高度设置为所有行的总高度。用户滚动时,行仍在添加和删除,但是滚动本身是由浏览器完成的。这使得它可以非常快速但流畅(众所周知,滚动事件很慢)。需要注意的是,浏览器的CSS引擎中存在一些错误/限制,这些错误/限制限制了元素的潜在高度。对于IE,恰好是0x123456或1193046像素。对于其他浏览器,它更高。

在“大号固定”分支中有一个实验性的解决方法,它通过将“页面”设置为1M像素高度,然后在这些页面内使用相对位置来填充可滚动区域,从而大大提高了限制。由于CSS引擎中的高度限制似乎有所不同,并且明显低于实际布局引擎中的高度限制,因此这给了我们更高的上限。

我仍在寻找一种方法,以达到无限制的行数而又不放弃SlickGrid当前在其他实现上所拥有的性能优势。

Rudiger,能否详细说明如何解决此问题?


1
我发现SlickGrid是最吸引人的-尤其是当它与jQuery一起使用时。恭喜!(尤其是对于态度和毅力的追求。):-)
安德拉斯·瓦斯

我正在尝试使用slickgrid显示excel标头,并且我看到当列过多时,slickgrid仅优化行的滚动,而不优化列的滚动。我还注意到,当列数超过120左右时,slickgrid会将新行放在新行中。可以在文件中的某处设置最大行数吗?
oneiros 2012年

1
SlickGrid v2.1已对列和行使用虚拟滚动。另外,列溢出问题已解决。
2012年

@Tin-这类似于我的方法;我比时间提前了几年!“用于将无限滚动构建到Web应用程序中的惰性块布局原语。” docs.google.com/document/d/…–
Rudiger

@Rudiger是的,大约一个月前我已经在Blink小组上看到了这个,但是我不太确定这在图片中的位置。惰性布局对DOM中实际存在的元素进行操作,而我们实际上无法做到。请详细说明:)

84

https://github.com/mleibman/SlickGrid/wiki

SlickGrid利用虚拟渲染使您能够轻松处理数十万个项目而不会降低性能。实际上,使用10行和100000行的网格在性能上没有区别。

一些重点:

  • 自适应虚拟滚动(处理数十万行)
  • 极快的渲染速度
  • 后台渲染更丰富的细胞
  • 可配置和可定制
  • 全键盘导航
  • 列大小调整/重新排序/显示/隐藏
  • 色谱柱自动定型和压入
  • 可插拔的单元格格式化程序和编辑器
  • 支持编辑和创建新行。“由mleibman

它是免费的(MIT许可证)。它使用jQuery。


它可以正常工作,直到精确到131,001行为止……也就是说,有一行这样的代码:data.length = Math.min(131000, parseInt(resp.total));...而且,当然,由于某种原因,它是硬编码的:(
Rudiger 2010年

6
它花了一些时间,但是我做了一些更改,使网格独立于data数组的长度。这很麻烦,但是我有响应填充了一个bigdata数组,并且databigdata数组中提取了较小的拉数。该程序的其余部分使用较小的数据数组,但滚动条测量和其他一些地方(对于许多行而言现在是无界的)除外。总而言之,比编写我自己的要容易得多。
Rudiger

8
@Rudiger:SlickGrid现在原生支持无限数量的行。见github.com/mleibman/SlickGrid/tree/unlimited-rows。一旦对此进行了彻底的测试,它将被合并到主分支中。

我正在尝试使用slickgrid显示excel标头,并且我看到当列太多时,slickgrid仅优化行的滚动,而不优化列的滚动。我还注意到,当有超过120列左右时,slickgrid会将新行放在新行中。可以在文件中的某处设置最大行数吗?
oneiros 2012年

如果您想要真正快速的东西,请不要依赖任何使用jquery来完成核心工作的东西,而要使用innerHTML而不是DOM append。在速度较慢的计算机上,JavaScript滚动条的速度可能比浏览器滚动条的速度慢,避免使用复杂的CSS规则,因此您应该花一些时间来简化单行的布局。在这种情况下,微优化可能意义重大。这只是提高性能的一般做法。jsPerf.com是您的朋友。
Vitim.us 2012年

37

我认为最好的网格如下:

我最好的3个选项是jqGrid,jqxGrid和DataTables。它们可以处理数千行,并支持虚拟化。


1
列表为+1,尽管在比较方面并没有太多。一个好的开始是增加每个提交的数量-到目前为止,Flexigrid为33,而SlickGrid为491。
Dan Dascalescu 2012年

12
修改SO的5分钟评论编辑限制。#1-jqGrid- 1000多次提交 ; #2-752 for DataTables ; #3-491 for SlickGrid ; #4-33为Flexigrid提交。Ingrid- 自2011年6月以来没有更新。jqGridView- 自2009
Dan Dascalescu 2012年

3
在前面的评论的基础上,我在这里包括每个项目的派生数:#1-SlickGrid-670个派生;#2-jqGrid-358个叉子; #3-Flexigrid-238;#4-数据表-216; #5-英格丽-41; #6-jqGridView-0;
ljs.dev


我可以评论一下Slickgrid仍然健在,但是上面引用的mleibman回购已死。新链接:github.com/6pac/SlickGrid(姆莱伯曼在回购协议的最后注释中引用了它),或www.slickgrid.net
Ben McIntyre,

25

我并不是要发动一场火焰大战,但是假设您的研究人员是人类,那么您对他们的了解并不如您所想的那样。仅仅因为它们拥有 PB级的数据,就不能使它们能够以任何有意义的方式查看甚至数百万条记录。他们可能会说他们想要查看数百万条记录,但这很愚蠢。让最聪明的研究人员进行一些基本的数学运算:假设他们花1秒钟查看每条记录。以这种速度,将需要1000000秒,这要花费超过六周的时间(每周工作40个小时,不中断食物或洗手间)。

他们(或您)是否真的认为一个人(看着电网的人)可以聚集这种注意力?他们在那一秒钟内真的完成了很多工作,还是(很有可能)过滤掉了不需要的东西?我怀疑在查看“大小合理”的子集之后,他们会为您描述一个过滤器,该过滤器会自动过滤掉那些记录。

正如paxdiablo和Sleeper Smith和Lasse V Karlsen所暗示的那样,您(和他们)没有考虑过这些要求。从好的方面来说,既然您已经找到了SlickGrid,我相信对那些过滤器的需求将立即变得显而易见。


2
需要数百万行并不总是与查看它们有关。有时,客户希望部分转储记录以在自己的数据分析系统中运行。
cbmeeks 2012年

10
如果将其转储为自己的分析数据,那么它不会显示在网页的网格中,对吗?
史蒂文·贝尼特斯

5
我不必一次全部看到它们。这就是列排序的Ctrl+F目的。替代方法(分页,网站搜索)差得多。尝试滚动查看问题或答案时,只需查看StackOverflow,滚动查看用户的评论历史记录时,只需查看Reddit。排序和即时搜索提供了Windows资源管理器所具有的功能,但网站却缺乏。
伊恩·博伊德

15

我可以肯定地说,您确实不需要向用户显示数百万行的数据。

世界上没有用户能够理解或管理该数据集,因此即使您从技术上设法将其提取出来,也不会为该用户解决任何已知问题。

相反,我将重点关注用户为什么要查看数据。用户不想仅仅为了查看数据就看到数据,通常会问一个问题。如果您专注于回答这些问题,那么您将更接近解决实际问题的事物。


16
我的用户是习惯于PB级数据的研究人员。我认为我的用户比您了解的多一点,尽管您在一般情况下肯定是正确的。至于为什么,此数据网格只是一组用于管理大数据的工具的一部分。
Rudiger 2010年

7

我建议使用带缓冲视图功能的Ext JS网格。

http://www.extjs.com/deploy/dev/examples/grid/buffer.html


确实是ExtJs。它基本上是专门为数据表示而构建的
KdgDev 2010年

1
ExtJs太好了,我想哭,以至于它不是建立在jQuery之上的
James Westgate

现在,您只能加载ExtJS的与网格相关的部分,因此向您的应用程序添加ExtJS网格不会太繁琐。但是,您仍然必须考虑外观上的差异,并仅针对该组件使用ExtJS主题化方式。
JD史密斯

7

(免责声明:我是w2ui的作者)

我最近写了一篇关于如何实现具有100万条记录的JavaScript网格的文章(http://w2ui.com/web/blog/7/JavaScript-Grid-with-One-Million-Records)。我发现最终存在3个限制使其无法提高:

  1. div的高度有限制(可以通过虚拟滚动来克服)
  2. 大约100万条记录后,排序和搜索等操作开始变慢
  3. RAM受限制,因为数据存储在JavaScript数组中

我已经用1百万条记录(除了IE)测试了网格,并且性能良好。请参阅文章以获取演示和示例。


有了这一百万条记录,您的html页面大小为3MB,但是当我加载数据时该页面的大小为15MB,w2ui可以处理吗?我需要所有数据来进行一些计算。
Chetan S. Choudhary

6

dojox.grid.DataGrid为数据提供了JS抽象,因此您可以使用提供的dojo.data存储库将其连接到各种后端,也可以编写自己的存储库。显然,您需要一个支持对这么多记录进行随机访问的记录。DataGrid还提供了完全可访问性。

编辑后,这里是Matthew Russell文章的链接,该文章应提供您所需的示例,并使用dojox.grid查看数百万条记录。请注意,它使用的是旧版本的网格,但是概念相同,只是对API进行了一些不兼容的改进。

哦,它是完全免费的开源。



4

这里有一些优化可以使您加快速度。只是大声思考。

由于行数可以是数百万,因此您将需要一个仅用于服务器中JSON数据的缓存系统。我无法想象有人要下载所有X百万个项目,但是如果这样做,那将是一个问题。在Chrome上对20M +整数数组进行的这项小测试不断在我的计算机上崩溃。

var data = [];
for(var i = 0; i < 20000000; i++) {
    data.push(i);
}
console.log(data.length);​

您可以使用LRU或其他某种缓存算法,并对愿意缓存多少数据有一个上限。

对于表单元本身,我认为构造/销毁DOM节点可能会很昂贵。相反,您可以预定义X个单元格,并且每当用户滚动到新位置时,就将JSON数据注入这些单元格中。滚动条实际上​​与表示整个数据集所需的空间(高度)没有直接关系。您可以任意设置表容器的高度,例如5000px,并将其映射到总行数。例如,如果容器的高度为5000px,并且总共有1000万行,则starting row ≈ (scroll.top/5000) * 10Mwhere scroll.top表示从容器顶部开始的滚动距离。这里的小演示

为了检测何时请求更多数据,理想情况下,对象应充当侦听滚动事件的中介者。该对象跟踪用户滚动的速度,并在看起来用户减速或完全停止时向相应的行发出数据请求。以这种方式检索数据意味着您的数据将要碎片化,因此在设计缓存时应牢记这一点。

同样,浏览器对最大传出连接的限制也可以发挥重要作用。用户可以滚动到某个位置,这将触发AJAX请求,但是在此之前,用户可以滚动到其他部分。如果服务器的响应速度不够快,则请求将排队,并且应用程序将无响应。您可以使用通过其路由所有请求的请求管理器,并且可以取消挂起的请求以腾出空间。


4

我知道这是一个老问题,但仍然..还有dhtmlxGrid可以处理数百万行。有一个具有50,000行的演示但是可以在网格中加载/处理的行数是无限的。

免责声明:我来自DHTMLX小组。


我想显示10 MB的Json数据并想在计算中使用它,DHTMLX可以做到这一点吗,使用该数据和html标签,我的浏览器页面大约为15 MB。值得使用DHTMLX吗?
Chetan S. Choudhary


3

免责声明:我大量使用YUI数据表 不无头痛了很久。它功能强大且稳定。为了满足您的需要,您可以使用ScrollingDataTable支持

  • X滚动
  • y滚动
  • xy滚动
  • 强大的事件机制

对于您所需要的,我认为您想要的是tableScrollEvent。它的API说

当固定滚动的DataTable滚动时触发。

由于每个DataTable使用一个DataSource,因此您可以通过tableScrollEvent 以及呈现循环大小来监视其数据,以便根据需要填充ScrollingDataTable。

渲染循环大小说

如果您的DataTable需要显示非常大的数据集的整体,则renderLoopSize配置可以帮助管理浏览器DOM渲染,以使UI线程不会被锁定在非常大的表上。任何大于0的值都将导致在setTimeout()链中执行DOM渲染,该setTimeout()链在每个循环中渲染指定的行数。由于没有硬性规定和快速规定,只有一般准则,因此应该为每个实现确定理想值:

  • 默认情况下,renderLoopSize为0,因此所有行均在单个循环中呈现。renderLoopSize> 0会增加开销,因此请谨慎使用。
  • 如果您的数据集足够大(行数X列数X格式化复杂度),使用户在视觉渲染中遇到延迟和/或导致脚本挂起,请考虑设置renderLoopSize
  • 小于50的renderLoopSize可能不值得。renderLoopSize> 100可能更好。
  • 除非有数百行,否则可能认为数据集不够大。
  • 具有renderLoopSize> 0和<总行数的确会导致表在一个循环中呈现(与renderLoopSize = 0相同),但它还会触发功能,例如从单独的setTimeout线程处理渲染后行条带化。

例如

// Render 100 rows per loop
 var dt = new YAHOO.widget.DataTable(<WHICH_DIV_WILL_STORE_YOUR_DATATABLE>, <HOW YOUR_TABLE_IS STRUCTURED>, <WHERE_DOES_THE_DATA_COME_FROM>, {
     renderLoopSize:100
 });

<WHERE_DOES_THE_DATA_COME_FROM>仅仅是一个数据源。它可以是JSON,JSFunction,XML甚至是单个HTML元素

在这里您可以看到我提供的简单教程。请注意,没有其他 DATA_TABLE插件同时支持单击和双击。YUI DataTable允许您。而且,即使没有JQuery您也可以使用它

一些例子,你可以看到

随意询问有关YUI DataTable的任何其他信息。

问候,


3

我有点不明白这一点,对于jqGrid,您可以使用虚拟滚动功能:

http://www.trirand.net/aspnetmvc/grid/performancevirtualscrolling

但是再一次,可以完成数百万行的过滤:

http://www.trirand.net/aspnetmvc/grid/performancelinq

我真的看不到“好像没有页面”的意思,我的意思是……无法在浏览器中一次显示1,000,000行-这是10MB的HTML原始数据,我有点看不到为什么用户不想看到这些页面。

无论如何...


2

我能想到的最佳方法是在滚动结束之前为每个滚动或某个限制加载json格式的数据块。json可以轻松转换为对象,因此可以轻松地构造表行


那就是我的方式。请求以JSON发送回一组行...我正在寻找支持此功能的javascript客户端渲染器!
Rudiger

什么???什么是“客户端网站渲染器”?任何JavaScript仍将需要进行ajax调用-因此您仍然需要确定某种传输格式。你无法逃避做一些工作。我的朋友,没有人会为您做这件事。
Andriy Drozdyuk

1
我知道必须进行AJAX调用;这部分很简单。客户端请求类似“ start = 20&limit = 20”的内容,并从服务器(XML或JSON格式)中检索第20-39行。“客户端渲染器”(我的术语!)会智能地发出这些请求(例如,当用户向下滚动时),并在漂亮的网格中无缝渲染结果。与您所说的相反,其他人为我完成了这项工作。这就是该问题的所有其他答案。
Rudiger

好吧,似乎没有一个“其他”为您做到这一点:)
Andriy Drozdyuk

1

我强烈推荐Open rico。从一开始就很难实现,但是一旦掌握了它就永远不会回头。




0

看一下dGrid:

https://dgrid.io/

我同意用户永远都不需要一次查看数百万行数据,但是dGrid可以快速显示它们(一次显示一个屏幕)。

不要煮大海来泡茶。


找不到您的茶(链接)。:)
Akshay

它现在拥有自己的站点:)
ColemanTO
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.