【问题标题】:Is there a default batch size that is used by MongoDB in the Bulk API?MongoDB 在批量 API 中是否使用了默认批量大小?
【发布时间】:2019-04-17 04:50:39
【问题描述】:

我是 MongoDB 新手,我有这个问题是因为我在以下链接中读到:“How can I improve MongoDB bulk performance?”,MongoDB 内部一次将列表分解为 1000 个操作。但是,我在 MongoDB 文档中找不到此信息。

这是否意味着当我使用 Bulk API 在 MongoDB 集合中插入 50,000 个文档时,MongoDB 会在内部将列表分成 1,000 个批次并执行 50 次批量插入操作?如果是,如果我将 50,000 个文档的列表分解为 1,000 个的子列表,我会获得相同的性能吗 文档并在 for 循环中使用批量插入操作?哪种方法更好?

请帮助我理解。

谢谢。

【问题讨论】:

  • 确实有点宽泛的回答。这里有现有的答案显示诸如“批量插入”之类的内容。例如,如果它是“我的”之一,那么我肯定会手动拆分批次,我这样做的主要原因是您不会在内存中构建包含 50,000 个项目的数组。最重要的是,您的进程加载数据不应该将那么多读入内存。如果你想要“性能”,通常最好有“许多工作进程”而不是“一个大进程”。
  • 感谢尼尔的回复。因此,我从您的回复中解释说,MongoDB 在执行批量插入操作之前确实将 50,000 个输入列表分解为 1,000 个列表。在这种情况下,我将 50K 文档列表拆分为任何大小 > 1K 的较小列表是否有意义(比如 2K,因为 Mongo 将再次将此列表拆分为最大 1K)。我相信这只是不必要的开销,我最好一次插入所有 50K 文档?我说的对吗?
  • 不将大量数据加载到内存中并打算存储在远程数据库中是有意义的。这就是这里推理的本质。如果我正在处理 10TB 的数据,我不希望将其加载到数据库中的进程甚至尝试一次将所有数据加载到内存中,即使有可能的机器能够做到这一点。然而,在“数据库”中存储 10TB 是完全合理的。
  • 当然,我知道在我的内存中加载大量数据并不是一件好事。但是,在我的特定用例中,我的应用程序服务器可以接收会导致创建大量对象的请求,并且这些对象需要有效地保存在 Mongo 中。这是我要解决的确切问题。在这种情况下,无论如何我肯定会将这些对象保存在内存中。所以在将这些对象插入数据库之前,我想知道是否应该将列表分解成更小的块或一次性插入。

标签: mongodb bulkinsert


【解决方案1】:

是的,如果您使用 Bulk API 在 MongoDB 集合中插入 50,000 个文档,mongo 最多会将其分解为 1000 个操作。 理想情况下,您应该自己批量制作 1000 个并进行插入,但在这种情况下,它不会有任何区别,因为数据已经存在于内存中。 在生产就绪的系统中,您不应该在单个请求中接受如此大量的数据。客户端应该能够发送小块数据,以便您可以将其存储在服务器上的队列中并在后台(其他线程)进行处理。

【讨论】:

    猜你喜欢
    • 2020-05-20
    • 1970-01-01
    • 2016-10-04
    • 2019-11-13
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2017-03-22
    • 2013-06-18
    相关资源
    最近更新 更多