我有一个场景,我需要从我的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(); }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。