Firebase RangeError: Maximum call stack size exceeded
Firebase RangeError: Maximum call stack size exceeded
下面是来自 问题的 firebase 读取查询性能测试,我只是将其更改为我自己的 firebase 实例并删除了顺序测试,只留下并行测试。
问题是,每当我 运行 这段代码并使 for 循环 i < 12
产生一个长度数组:32,768
时,我总是收到一个错误提示超出调用堆栈:RangeError: Maximum call stack size exceeded
但我无法弄清楚是什么导致了此错误...我尝试在本地主机上和通过云函数对其进行测试但没有成功。
(引用的 SO 测试在 i<12 时有效,但如果我将其更改为 13 也会中断).
function loadVideosParallel(videoIds, callback) {
Promise.all(
videoIds.map((id) => {
return admin.database().ref("test").child(id).once('value')
.then((snapshot) => {
return snapshot;
})
})
).then((r) => callback());
}
function loadVideosForUser(loadVideosParallel, callback) {
admin.database().ref("test").once('value').then((snapshot) => {
var videoKeys = Object.keys(snapshot.val());
for (var i=0; i < 13; i++) {
videoKeys = videoKeys.concat(videoKeys);
}
loadVideosParallel(videoKeys, function() {
if (callback) callback();
});
})
}
let start = Date.now();
loadVideosForUser(loadVideosParallel, function() {
const endTime = (Date.now() - start)+'ms';
console.log('parallel done after '+ endTime +'ms');
});
2017-12-20T23:26:28.527Z E helloWorld: RangeError: Maximum call stack
size exceeded
at T (/user_code/node_modules/firebase-admin/lib/database/database.js:139:366)
at /user_code/node_modules/firebase-admin/lib/database/database.js:190:120
at ta (/user_code/node_modules/firebase-admin/lib/database/database.js:45:40)
at ua (/user_code/node_modules/firebase-admin/lib/database/database.js:45:89)
at Ag (/user_code/node_modules/firebase-admin/lib/database/database.js:190:93)
at /user_code/node_modules/firebase-admin/lib/database/database.js:195:260
at Oc (/user_code/node_modules/firebase-admin/lib/database/database.js:85:363)
at Oc (/user_code/node_modules/firebase-admin/lib/database/database.js:85:449)
at Oc (/user_code/node_modules/firebase-admin/lib/database/database.js:85:449)
at Nc (/user_code/node_modules/firebase-admin/lib/database/database.js:85:316)
2017-12-20T23:26:29.758741829Z D helloWorld: Function execution took
5107 ms, finished with status: 'crash'
有人有什么见解吗?我试着查看 /user_code/node_modules/firebase-admin/lib/database/database.js
文件,但它被缩小了,所以无法真正判断发生了什么。
您正在排队超过 32,768 个读取操作,这使 SDK 中的堆栈之一溢出。在您的代码中加载那么多项目而没有任何流控制似乎是一个 糟糕 的想法,所以我真的很高兴 SDK 能够解决问题。考虑分批加载更合理的项目。
但总的来说:尝试限制从数据库加载数千个项目。如果聚合操作需要那么多项目,那么 much 最好将聚合值显式保存在数据库中并在每次写入操作时更新它。
下面是来自
问题是,每当我 运行 这段代码并使 for 循环 i < 12
产生一个长度数组:32,768
时,我总是收到一个错误提示超出调用堆栈:RangeError: Maximum call stack size exceeded
但我无法弄清楚是什么导致了此错误...我尝试在本地主机上和通过云函数对其进行测试但没有成功。
(引用的 SO 测试在 i<12 时有效,但如果我将其更改为 13 也会中断).
function loadVideosParallel(videoIds, callback) {
Promise.all(
videoIds.map((id) => {
return admin.database().ref("test").child(id).once('value')
.then((snapshot) => {
return snapshot;
})
})
).then((r) => callback());
}
function loadVideosForUser(loadVideosParallel, callback) {
admin.database().ref("test").once('value').then((snapshot) => {
var videoKeys = Object.keys(snapshot.val());
for (var i=0; i < 13; i++) {
videoKeys = videoKeys.concat(videoKeys);
}
loadVideosParallel(videoKeys, function() {
if (callback) callback();
});
})
}
let start = Date.now();
loadVideosForUser(loadVideosParallel, function() {
const endTime = (Date.now() - start)+'ms';
console.log('parallel done after '+ endTime +'ms');
});
2017-12-20T23:26:28.527Z E helloWorld: RangeError: Maximum call stack size exceeded at T (/user_code/node_modules/firebase-admin/lib/database/database.js:139:366) at /user_code/node_modules/firebase-admin/lib/database/database.js:190:120 at ta (/user_code/node_modules/firebase-admin/lib/database/database.js:45:40) at ua (/user_code/node_modules/firebase-admin/lib/database/database.js:45:89) at Ag (/user_code/node_modules/firebase-admin/lib/database/database.js:190:93) at /user_code/node_modules/firebase-admin/lib/database/database.js:195:260 at Oc (/user_code/node_modules/firebase-admin/lib/database/database.js:85:363) at Oc (/user_code/node_modules/firebase-admin/lib/database/database.js:85:449) at Oc (/user_code/node_modules/firebase-admin/lib/database/database.js:85:449) at Nc (/user_code/node_modules/firebase-admin/lib/database/database.js:85:316) 2017-12-20T23:26:29.758741829Z D helloWorld: Function execution took 5107 ms, finished with status: 'crash'
有人有什么见解吗?我试着查看 /user_code/node_modules/firebase-admin/lib/database/database.js
文件,但它被缩小了,所以无法真正判断发生了什么。
您正在排队超过 32,768 个读取操作,这使 SDK 中的堆栈之一溢出。在您的代码中加载那么多项目而没有任何流控制似乎是一个 糟糕 的想法,所以我真的很高兴 SDK 能够解决问题。考虑分批加载更合理的项目。
但总的来说:尝试限制从数据库加载数千个项目。如果聚合操作需要那么多项目,那么 much 最好将聚合值显式保存在数据库中并在每次写入操作时更新它。