【问题标题】:Firebase RangeError: Maximum call stack size exceededFirebase RangeError:超出最大调用堆栈大小
【发布时间】:2018-06-03 14:22:58
【问题描述】:

下面是来自this SO 问题的firebase 读取查询性能测试,我只是将其更改为我自己的firebase 实例并删除了顺序测试,只留下了并行测试。

问题是,每当我运行此代码并创建 for 循环 i < 12 导致数组长度为:32,768,我一直收到错误消息,指出调用堆栈超出:RangeError: Maximum call stack size exceeded 但我可以'不知道是什么导致了这个错误......我尝试在 localhost 和云功能上对其进行测试,但没有成功。

(引用的 SO 测试在 i。

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: 最大调用堆栈 超出尺寸 在 T (/user_code/node_modules/firebase-admin/lib/database/database.js:139:366) 在 /user_code/node_modules/firebase-admin/lib/database/database.js:190:120 在 ta (/user_code/node_modules/firebase-admin/lib/database/database.js:45:40) 在 ua (/user_code/node_modules/firebase-admin/lib/database/database.js:45:89) 在 Ag (/user_code/node_modules/firebase-admin/lib/database/database.js:190:93) 在 /user_code/node_modules/firebase-admin/lib/database/database.js:195:260 在 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 毫秒,完成状态:'crash'

有人有什么见解吗?我尝试查看 /user_code/node_modules/firebase-admin/lib/database/database.js 文件,但它已被缩小,因此无法真正判断发生了什么。

【问题讨论】:

标签: node.js firebase firebase-realtime-database firebase-admin


【解决方案1】:

您排队的读取操作超过了 32,768 次,这溢出了 SDK 中的一个堆栈。在您的代码中加载这么多项目而没有任何流控制似乎是一个的想法,所以我实际上很高兴 SDK 能成功。考虑分批加载更合理的项目。

但总的来说:尽量限制从数据库加载数千个项目。如果您需要这么多项目进行聚合操作,那么最好将聚合值显式保存在数据库中并在每次写入操作时更新它。

【讨论】:

  • 感谢您的回答,但为什么 32,768 读取操作在引用的测试中起作用,在剥离顺序部分并仅测试并行部分之后?但是,如果我将它复制到本地主机或我自己的云功能,它就不再起作用了?
  • 测试背后的动机是,我试图看看 fanout-on-read 和 fanout-on-write 对于活动提要有何不同
猜你喜欢
  • 2019-05-04
  • 2018-02-06
  • 1970-01-01
  • 2021-05-30
  • 2021-07-11
  • 2019-07-05
  • 2015-04-26
相关资源
最近更新 更多