如何发送真正大的json对象作为响应 - node.js with express

时间:2015-05-12 21:19:13

标签: json node.js memory express

我收到此错误FATAL ERROR: JS Allocation failed - process out of memory并且我已经确定这是我向res.json(或JSON.stringify发送非常大的json对象的问题 为了给你一些上下文,我基本上发送大约30,000个配置文件(每个配置文件有大约10,000行)作为一个json对象

我的问题是,有没有办法发送这么大的json对象,或者有更好的方法来流式传输它(比如使用socket.io?)

我正在使用:node v0.10.33,express @ 4.10.2

更新:示例代码

var app = express();

app.route('/events')
.get(function(req, res, next) {
  var configdata = [{config:<10,000 lines of config>}, ... 10,000 configs]
  res.json(configdata); // The out of memory error comes here
})

3 个答案:

答案 0 :(得分:2)

经过大量的尝试,我终于决定使用socket.io一次发送每个配置文件而不是一次发送所有配置文件。这解决了崩溃我的服务器的内存不足问题。谢谢你的帮助

答案 1 :(得分:2)

尝试使用流。您需要的是一个可读的流,可按需生成数据。我在这里写简化代码:

var Readable = require('stream').Readable;
var rs = Readable();

rs._read = function () {
    // assuming 10000 lines of config fits in memory
    rs.push({config:<10,000 lines of config>);
};

rs.pipe(res);

答案 2 :(得分:0)

您可以尝试在命令行上使用the --max_old_space_size flag增加内存节点。

可能有更优雅的解决方案。我的第一反应是建议将res.json()与Buffer对象一起使用,而不是尝试一次性发送整个对象,但后来我意识到转换为JSON的任何东西都可能想要一次性使用整个对象无论如何。因此,即使您正在切换到流,也会耗尽内存。或者至少是我期望的那样。