分页大数据集

时间:2015-07-07 02:38:47

标签: node.js mongodb mongodb-query mongojs

我有一大堆数据,我想编写一个脚本来读取然后处理;在我的例子中抓取一些字段并发送到RESTful API。

为了节省负载,我想使用limit并跳过对我检索的数据进行分页并在while循环中使用它,但是因为它是nodejs,所以我必须使用回调。

在没有崩溃/超时的情况下处理nodejs / mongo中大量数据的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

(我假设您的文件不需要按任何特定顺序处理。)

忘记skip因为这是一项昂贵的操作。来自官方documentation

  

cursor.skip()方法通常很昂贵,因为它需要   服务器从集合或索引的开头走到get   开始返回结果之前的偏移或跳过位置。作为   offset(例如上面的pageNumber)增加,cursor.skip()将成为   更慢,更密集的CPU。使用更大的集合,cursor.skip()   可能会成为IO界限。

Blakes Seven共享的答案中建议的转发转发是一个不错的选择。但是,使用它的经验可能不是很愉快,因为你需要跟踪异步性的分页,除非你的代码简短而整洁,否则很容易陷入烦躁的调试时间。

为了保持最灵活,不要求不必要地进行排序,只需从主集合中删除可配置大小的数据块,处理它们,然后将它们转储到辅助集合中。如果每个块的处理时间很长,那么不是直接存储到另一个集合,而是将文档存储在临时集合中,处理它,然后将整个(临时)集合转储到二级集合(或者只是删除文档,如果你没有不需要它们。这就是我要做的事情。但是,在保留主要集合的备份之后。)

这有更多好处:

  1. 更加抗错,因为您不必处理页面/块号。
  2. 强大,因为即使在迭代过程中出现问题,您也不会失去先前块的工作。您只需要重新启动当前迭代。
  3. 灵活/可扩展,因为您可以在任意两次迭代之间配置块大小,并根据处理的缓慢或快速来增加或减少。此外,您可以在很长的时间内传播处理 - 将结果保存到一定时间,然后休息或休假,并在您返回时恢复!此外,您可以将负载分配给多个工作进程以加快速度。
  4. 祝你好运!