我有一个场景,我需要从我的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(); }