Streaming / Plugin JSON.stringify Node.js / Express中的输出

前端之家收集整理的这篇文章主要介绍了Streaming / Plugin JSON.stringify Node.js / Express中的输出前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个场景,我需要从我的Node.js / Express RESTful API返回一个非常大的对象,转换成一个 JSON字符串.
res.end(JSON.stringify(obj));

但是,这似乎不能很好地扩展.具体来说,它在我的测试机器上运行良好,1-2个客户端连接,但我怀疑这个操作可能会杀死cpu&许多客户端同时请求大型JSON对象时的内存使用情况.

我已经在寻找一个异步JSON库,但是the only one I found似乎有一个问题(具体来说,我得到一个[RangeError]).不仅如此,它会将字符串返回一个大块(例如,回调在整个字符串中被调用一次,意味着内存占用不会减少).

我真正想要的是一个完全异步的管道/流版本的JSON.stringify函数,这样就可以将数据直接打包到数据流中,从而节省了内存占用,同时也消耗了cpu同步时尚.

理想情况下,您应该按照流量传输数据,而不是将所有数据缓冲为一个大对象.如果你不能改变这一点,那么你需要将stringify打破成更小的单位,并允许主事件循环使用 setImmediate处理其他事件.示例代码(我将假设主对象有很多顶级属性,并使用它们来分割工作):
function sendObject(obj,stream) {
    var keys = Object.keys(obj);
    function sendSubObj() {
       setImmediate(function(){
          var key = keys.shift();
          stream.write('"' + key + '":' + JSON.stringify(obj[key]));
          if (keys.length > 0) {
            stream.write(',');
            sendSubObj();
          } else {
            stream.write('}');
          }
       });
    })
    stream.write('{');
    sendSubObj();
}

猜你在找的Json相关文章