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

Sha*_*oon 1 javascript firebase

目前我正在使用Fireproof它以承诺为基础,这就是我所拥有的:

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

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

McM*_*ath 6

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

您可以进行一些可能的性能优化.首先,您可以使用for循环而不是Array.prototype.forEach(),对于非常大的数组,它往往更快.

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

或者,使用ES6 对...的语法:

for (let question of questionsSnapshot) {
  console.log(question.val());
}
Run Code Online (Sandbox Code Playgroud)

但是,在一个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());
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您对父函数进行多次调用(即,经常执行Firebase查询),这只会带来显着的性能提升.听起来我觉得问题更多的是关于在已经拥有它的情况下迭代大型数组,而不是多次执行相同的查询.

因此,如果您想对阵列中的每个项目执行操作,我认为您正在做的事情很好.20000件物品并不是那么庞大; 在我不起眼的计算机上迭代这样一个数组大约需要5ms.事实上,无论你对每个项目做什么,都可能需要比迭代遍历数组更长的时间.

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