【问题标题】:How do I iterate through a large dataset with Firebase / Node.js?如何使用 Firebase / Node.js 遍历大型数据集?
【发布时间】:2016-02-20 11:39:17
【问题描述】:

目前我正在使用Fireproof 使其基于承诺,这​​就是我所拥有的:

fbase.child("questions").once("value").then(function(questionsSnapshot) {
  return questionsSnapshot.forEach(function(questionSnapshot) {
    return console.log(questionSnapshot.val());
  });
});

但是questions 是巨大的。 20,000 多条记录。不确定 - 有没有更好的方法?

【问题讨论】:

  • Firebase Javascript 客户端现在支持 Promise:firebase.com/blog/2016-01-21-keeping-our-promises.html。除此之外:处理长列表的最佳方法是避免使用它们。如何做到这一点取决于用例,我怀疑是记录它们。
  • @FrankvanPuffelen 我明白了,但是您将如何向所有用户发送电子邮件营销活动?我计划保留 /notices/{auth.uid} 并需要在计划的作业中进行迭代。 child_added 会有效地处理它,但“值”会效率低下[1],因为它将项目存储在内存缓存中。 [1] 全部内容已同步firebase.google.com/docs/reference/js/…
  • @FrankvanPuffelen 我猜唯一真正的答案是使用提供 nextPageToken 或某种类型的延续令牌的存储引擎。那么问题是如何将firebase数据与所述存储引擎同步。
  • @LeblancMeneses Firebase 支持带有 orderByKey().startAt(key)orderByChild("prop").startAt("value", key) 的锚项目。

标签: javascript firebase


【解决方案1】:

如果我理解正确的话,这个问题实际上是关于 Node 中的迭代性能,而不是与 Firebase 有任何关系。问题是,一旦您拥有这 20000 多个对象数组,遍历它们并对每个对象执行操作的最佳方法是什么?

您可以进行一些可能的性能优化。首先,您可以使用for 循环而不是Array.prototype.forEach()tends to be faster 用于非常大的数组。

...
var len = questionsSnapshot.length;
for (var i = 0; i < len; i++) {
  console.log(questionsSnapshot[i].val());
}

或者,使用 ES6 for...of 语法:

for (let question of questionsSnapshot) {
  console.log(question.val());
}

但是,在对包含 20000 个对象的数组使用 Node 中的 console.time() 进行快速测试时,我发现并没有获得一致的性能提升。事实上Array.prototype.forEach() 通常比使用for 循环更快。

您可能进行的另一个优化是将传递给forEach() 的嵌套回调移动到模块范围内。这样,它只会被创建一次,而不是每次调用其父函数时都重新创建。

fbase.child("questions").once("value").then(function(questionsSnapshot) {
  return questionsSnapshot.forEach(logValue);
});

function logValue(questionSnapshot) {
  return console.log(questionSnapshot.val());
}

但是,如果您对父函数进行多次调用,即经常执行 Firebase 查询,这只会显着提高性能。在我看来,这个问题更多的是关于在你已经拥有一个大型数组后迭代它,而不是多次执行相同的查询。

所以,如果您想对数组中的每个项目执行操作,我认为您所做的很好。 20000 个对象并不是那么大;在我不起眼的计算机上遍历这样一个数组大约需要 5 毫秒。事实上,无论你对每个项目做什么,都可能比遍历数组花费更长的时间。

如果您发现性能有特定的滞后,您可能需要通过编辑帖子来详细说明。否则,我建议不要担心。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 2021-03-05
    相关资源
    最近更新 更多