如何发送非常非常大的 json 对象作为响应 - node.js with express
how to send really really large json object as response - node.js with express
我一直收到此错误 FATAL ERROR: JS Allocation failed - process out of memory
,我已确定这是我将非常大的 json 对象发送到 res.json
(或 JSON.stringify
)
为了给你一些上下文,我基本上发送了大约 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
})
您可以尝试在命令行上使用 the --max_old_space_size
flag 增加可用的内存节点。
可能有更优雅的解决方案。我的第一反应是建议将 res.json()
与 Buffer 对象一起使用,而不是尝试一次性发送整个对象,但后来我意识到无论是什么转换为 JSON 都可能想要使用整个对象无论如何,立即反对。因此,即使您正在切换到流,您也会 运行 内存不足。或者至少这是我所期望的。
经过多次尝试,我最终决定 socket.io 一次发送每个配置文件,而不是一次发送所有配置文件。这解决了导致服务器崩溃的内存不足问题。感谢您的帮助
尝试使用流。您需要的是按需生成数据的可读流。我将在这里编写简化代码:
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);
我一直收到此错误 FATAL ERROR: JS Allocation failed - process out of memory
,我已确定这是我将非常大的 json 对象发送到 res.json
(或 JSON.stringify
)
为了给你一些上下文,我基本上发送了大约 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
})
您可以尝试在命令行上使用 the --max_old_space_size
flag 增加可用的内存节点。
可能有更优雅的解决方案。我的第一反应是建议将 res.json()
与 Buffer 对象一起使用,而不是尝试一次性发送整个对象,但后来我意识到无论是什么转换为 JSON 都可能想要使用整个对象无论如何,立即反对。因此,即使您正在切换到流,您也会 运行 内存不足。或者至少这是我所期望的。
经过多次尝试,我最终决定 socket.io 一次发送每个配置文件,而不是一次发送所有配置文件。这解决了导致服务器崩溃的内存不足问题。感谢您的帮助
尝试使用流。您需要的是按需生成数据的可读流。我将在这里编写简化代码:
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);