下面是来自this SO问题的firebase读取查询性能测试,我刚刚将其更改为我自己的firebase实例并删除了顺序测试,只留下了并行测试。
问题是,每当我运行此代码并且我使for循环i < 12
产生一个长度为32,768
的数组时,我就会收到一条错误,指出调用堆栈已超出:{{ 1}}但我无法弄清楚是什么导致了这个错误......我尝试在localhost和通过云功能测试它但没有成功。
(引用的SO测试适用于i <12,但如果我将其更改为13则会中断。
RangeError: Maximum call stack size exceeded
2017-12-20T23:26:28.527Z E helloWorld:RangeError:最大调用堆栈 大小超过 在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) 在Oc(/user_code/node_modules/firebase-admin/lib/database/database.js:85:449) 在Oc(/user_code/node_modules/firebase-admin/lib/database/database.js:85:449) 在Nc(/user_code/node_modules/firebase-admin/lib/database/database.js:85:316) 2017-12-20T23:26:29.758741829Z D helloWorld:执行功能 5107毫秒,完成状态:'崩溃'
有人有任何见解吗?我试着查看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');
});
文件,但它已经缩小了,所以无法确切地说明发生了什么。
答案 0 :(得分:1)
您排队超过32,768个读取操作,这会溢出SDK中的一个堆栈。在您的代码中加载没有任何流量控制的许多项目似乎是一个糟糕的想法,所以我真的很高兴SDK解决了。考虑批量加载更合理的物品。
一般情况下:尝试限制从数据库中加载数千个项目。如果您需要多个项目进行聚合操作,那么您最好多更好地在数据库中显式保留聚合值并在每次写入操作时更新它。