【问题标题】:NodeJS to Client : large data sending performanceNodeJS to Client:大数据发送性能
【发布时间】:2017-03-21 12:26:39
【问题描述】:

如何将大数据从 NodeJS 发送到客户端? 我试过这两个: 1. Socket.io 请求 2.ajax GET请求 但是两种方式都很慢。 我正在使用 mongoDB。数据大小将是 1,000,000+ 个对象(1-2GB),但即使发送 10,000 个数据,速度也很慢。 我怎样才能让它更快? (从MongoDB到NodeJS的数据读取时间没问题。)

这是 Socket.io 代码

=>NodeJS

io.sockets.on('connection', function(socket) {
   socket.on('getData', function() {
            var items = TestModel.find();
            items.find({},function(err,obj){
                    for(var i=0;i<obj.length;i++){
                    socket.emit('responseData', obj[i]);
                    }
                    socket.emit('complete',"Item length : ");
            });
    });
});});

如果我使用socket.emit('responseData', obj),我会得到一个溢出错误

=> 索引.HTML

      <html>
        <head>
          <meta charset="utf-8"/>
           <script src="/socket.io/socket.io.js"></script>
          <title></title>
       </head>
      <body>
    Socket.io Test
    </body>
      <script>
      window.onload = function() {
        var socket = io.connect();
        socket.emit('getData');
            var i=0;
            //socket.emit('getName');
        socket.on('responseData', function(data) {
          i++;
        });
    socket.on('complete',function(data){
    alert(data+i);
    });
      };
      </script>
    </html>

这是 Ajax GET 代码

=>NodeJS

    app.get('/load',function(req,res){
            var items = TestModel.find();
            console.log("Model loaded");
            items.find({},function(err, obj){
                    res.send(JSON.stringify(obj));
                    console.log("Sent Models"); 
            });
    });

=> 阿贾克斯

  $(function(){
    $(document).ready(function(){
            $.get('/load', {}, function(data){
                    ...
            });
    });});

【问题讨论】:

  • 大数据有什么用?客户端是否绝对需要一次全部 2GB?
  • 是的。这是基因组数据。真的很大。
  • 慢到底是什么?是网络 IO 还是 JSON.stringify(obj) 之类的东西?剖析师怎么说?

标签: javascript ajax node.js mongodb sockets


【解决方案1】:

压缩

检查和/或启用压缩,您可以获得高达 10 倍的增益,具体取决于数据和格式。压缩质量和服务器 CPU 使用率之间存在折衷,一般来说,从浏览器(或客户端)支持的最佳压缩算法开始。

如果客户在您的控制之下,您甚至可以尝试xz 或其他更奇特的东西:)

缓存

标记您的回复 (https://en.wikipedia.org/wiki/HTTP_ETag) 并为 If-None-Match: ... 请求标头字段添加挂钩。

流媒体

取决于客户端使用数据的目的,是否保存?处理?显示?在许多情况下,客户端可以开始对部分数据执行操作。如果那部分是在响应的开始,流式传输就很有意义

并行化

客户端可以使用Range: ...请求头域来下载数据段。在这种情况下,单个客户端可以同时针对给定数据集的段发出多个请求。如果客户的网络很糟糕(例如另一个大陆),这通常会有所帮助。

预览

也许客户端可以首先处理或“显示”数据的简化表示。如果客户端背后有人类用户,他们可能希望在决定下载之前快速检查您的数据。在服务器端生成缩略图或预览的图像和设计文档很常见。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 2013-07-18
    相关资源
    最近更新 更多