3

我正在使用 MongoDB 来存储数据。我正在输入很好地分块的数据,但也可以很容易地组合成一个大块并一次全部推送。

一次性推送所有数据有优势吗?还是我应该单独推送每个块?

另外,我一次可以推送多少数据有什么限制吗?一次推送所有内容大约需要 30MB,而每个块只有大约 10KB。无论哪种情况,我都将存储相同数量的文档(每个文档<1KB)。我正在使用 pymongo,以防万一。

4

1 回答 1

3

主要考虑三个方面:

  1. 以较小的批次通过网络发送文档的开销。例如,您还需要发送多少数据才能发送文档。
  2. 由于等待插入被确认,发送更多批次有多少额外的延迟。
  3. 具有更多文档的大型消息需要更多时间在服务器上执行插入导致周期的事实是服务器似乎“锁定”。

大小开销:

发送的插入消息有 20 个字节加上“.”长度的修复开销。细绳。单个消息的大小限制在几十 MB 范围内,因此您可以节省一些数据传输空间,但对于 1KB 的文档,开销比率已经可以忽略不计。

潜伏:

根据客户端到服务器的“网络距离”,这可能会产生更大的影响。非异步驱动程序将发送插入消息,然后等待回复。这包括进行插入的时间以及将消息发送到服务器并接收回复的时间。即使在 1/4 毫秒的快速往返本地网络上,发送 3,000 条消息 (30MB/10KB) 也会导致 750 毫秒的等待时间。如果客户端是“远程”的并且有 10 毫秒的 ping 时间,那么我们将等待 30 秒。异步驱动程序可以通过发送更多请求来填充等待时间。

服务器锁定:

当您在一批中插入更多文档时,服务器将获取并保持数据库锁定更长的时间。这将在写入完成时停止与数据库的所有其他交互(包括更新索引等。根据您的工作负载,服务器执行写入时引发的暂停可能会给其他写入者和读取者带来不必要的问题。

最后,批处理插入有一个主要缺点:如果任何插入失败,您将不知道哪个失败。服务器可以返回错误但不会说明哪个文档失败。您可以让服务器“继续出错”,但这只会使情况稍微好一些。

我鼓励您查看 Python 驱动程序的电机扩展。它应该允许您:

  1. 通过在同一连接上发送多个请求而不等待每个请求的回复来解决延迟问题。
  2. 允许您将每个插入作为单独的请求发送,以便您知道每个插入会发生什么。
  3. 并允许其他读取和写入自然地与您正在生成的写入交错。

HTH,罗伯

完全披露:我在Java 异步驱动程序上工作,但任何异步驱动程序都应该能够提供上面列出的好处。

于 2013-11-01T18:41:29.363 回答