如何使用Firebase / Node.js迭代大型数据集?

时间:2016-02-20 02:39:39

标签: javascript firebase

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

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

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

1 个答案:

答案 0 :(得分:6)

如果我理解正确的话,这个问题实际上是关于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件物品并不是那么庞大;在我不起眼的计算机上迭代这样一个数组大约需要5ms。事实上,无论你对每个项目所做的是什么,都可能需要比在数组中迭代更长的时间。

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