我收到此错误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
})
答案 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的任何东西都可能想要一次性使用整个对象无论如何。因此,即使您正在切换到流,也会耗尽内存。或者至少是我期望的那样。