Javascript 通过MariaDB、Sequelize&;获取数百万条记录;要在DevExtreme PivotGrid中显示的Node.js

Javascript 通过MariaDB、Sequelize&;获取数百万条记录;要在DevExtreme PivotGrid中显示的Node.js,javascript,node.js,mariadb,sequelize.js,devextreme,Javascript,Node.js,Mariadb,Sequelize.js,Devextreme,标题已经概括了这一点 我目前面临的任务是:SELECT语句会产生360万条包含多个列的记录。这个完整的数据包应该发送到客户端,这样浏览器就可以在透视网格中显示所有内容。不幸的是,分页不是一种选择 使用的堆栈是MariaDB、Node.js v8.11.3、Sequelize v3和客户端的DevExtreme 正如您所想象的,节点服务器会因数据量过大而崩溃 我非常感谢您能告诉我如何实现这一点,或者您是否有完成这一任务的经验,并得出结论,这是不能用web应用程序实现的 非常感谢您,祝您度过愉快的一

标题已经概括了这一点

我目前面临的任务是:SELECT语句会产生360万条包含多个列的记录。这个完整的数据包应该发送到客户端,这样浏览器就可以在透视网格中显示所有内容。不幸的是,分页不是一种选择

使用的堆栈是MariaDB、Node.js v8.11.3、Sequelize v3和客户端的DevExtreme

正如您所想象的,节点服务器会因数据量过大而崩溃

我非常感谢您能告诉我如何实现这一点,或者您是否有完成这一任务的经验,并得出结论,这是不能用web应用程序实现的

非常感谢您,祝您度过愉快的一天


帕特里克回答你的问题:你不能

直接向客户机提供庞大的数据集通常是个坏主意。 假设您的示例数据是每行1kb,您将加载3Gb的数据。 那么多的数据将必须通过网络发送,因此服务器/客户机将耗尽内存,或者如果没有问题,则加载和使用的速度将非常缓慢

这里没有简单的解决方案,但您可以避免发送那么多数据 通过重新思考这些数据现在是如何存在的,以便只发送这些数据的聚合,或者通过使用使用分页的客户端库(devexpress的透视表不这样做)


为了回答部分问题,您可以通过使用和websocket等技术将整个数据集发送到客户端之前避免将其加载到内存中,从而避免Node.js崩溃

360万行。让我们假设每行有128字节的数据,这是460800000字节439MB的原始数据,这听起来不太糟糕。 但这些数据将被包装在对象/模型中/转换为json,因此您的内存需求至少是原来的十倍4.3GB

好吧,还是不错。现在我们需要将其推送到浏览器,对其进行样式设置,将其包装为html、json等。。。 我们将把json中的大约1.4GB推送到客户端。客户端下载很高兴。json在浏览器中。它正在变成一个物体。内存大约是4倍5.6GB。不太破旧,但浏览器会被压缩,因为每个标签有256MB的内存限制(我在编写游戏时遇到过这个问题,每个浏览器的内存限制会有所不同)

但假设它是一个自定义的无界浏览器,可以 迭代json并生成类似于电子表格的显示,创建所有DOM节点,将它们附加到DOM树,附加事件处理程序,等等。。内存时间20:112GB

因此,客户有一个巨大的游戏装备,里面有惊人数量的RAM,一个可以处理寻址空间的浏览器,以及一个可以处理这个问题的操作系统。 现在,您进入了寻呼的有趣领域。操作系统需要对RAM进行分页,因为有太多未使用的内存,并且当用户盯着屏幕时,操作系统有更高优先级的任务要运行。任何一微秒都不会消失。写入光盘,在每个卷轴上从光盘读取,杀死客户端的硬盘驱动器

简而言之,浏览器不允许这样做,因为它有内存限制。向您的客户解释他想要的东西需要定制操作系统、定制浏览器和定制计算机,但由于CPU的限制,速度仍然很慢

就像谷歌文档一样,根据需要加载。当用户滚动时,加载所需的显示数据,不多不少,并卸载屏幕外的数据5分钟,以保持在您的256MB限制之下。当您完成一个查询时,只需设置一个偏移量并限制所需结果的数量。其余的东西都是一样的


现实世界是有限制的,你的客户不希望。使它们保持平衡。

web客户端是否可以显示360万行而不滚动?@RatulSharker谢谢您的提问。那将是下一个任务。应该有虚拟滚动或类似的选项,这样记录将存储在内存中,但不会立即显示。所以用户肯定要滚动。但是,由于用户能够重新排列数据透视网格中的列,所有数据都必须可用。什么样的人能够在360万行中滚动??使用数据库来总结数据是一种有用的方法。