分页大型数据集

Paging Large Datasets

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

为了节省负载,我想使用 limit 和 skip 对我检索的数据进行分页并将其放入 while 循环中,但是由于它是 nodejs,我必须使用回调。

在没有 crashing/timing 的情况下读取 nodejs/mongo 中的大量数据的最佳方法是什么?

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

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

The cursor.skip() method is often expensive because it requires the server to walk from the beginning of the collection or index to get the offset or skip position before beginning to return results. As the offset (e.g. pageNumber above) increases, cursor.skip() will become slower and more CPU intensive. With larger collections, cursor.skip() may become IO bound.

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

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

这有更多好处:

  1. 更多 error-resistant,因为您不必处理 page/chunk 个数字。
  2. 稳健,因为即使在迭代过程中出现问题,您也不会丢失为之前的块所做的工作。您只需要重新启动当前迭代。
  3. Flexible/scalable,因为您可以在任意两次迭代之间配置块大小,并根据处理的速度进行增减。此外,您可以将处理分散到较大的时间跨度 - 将结果保存到特定时间,然后休息或休假,并在 return 时继续!此外,您可以将负载分配给多个工作进程以加快处理速度。

祝你好运!