我有一种情况,我需要从Node.js / Express RESTful API返回一个很大的对象,并将其转换为JSON字符串。
res.end(JSON.stringify(obj));
但是,这似乎无法很好地扩展。具体来说,它在连接1-2个客户端的测试机上运行良好,但我怀疑当许多客户端同时请求大型JSON对象时,此操作可能会浪费CPU和内存使用率。
我四处寻找一个异步JSON库,但是我发现的唯一一个库似乎有问题(特别是,我收到了[RangeError])。不仅如此,它还以很大的一部分返回字符串(例如,对整个字符串调用一次回调,这意味着不会减少内存占用)。
我真正想要的是JSON.stringify函数的完全异步管道/流版本,以便它在将数据直接打包到流中时写入数据…这样既节省了内存,又节省了CPU的占用。同步的方式。
理想情况下,应按需流式处理数据,而不要将所有内容都缓冲到一个大对象中。如果您不能更改此设置,则需要将string化分成较小的单元,并允许主事件循环使用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(); }