MongoDB有很多小上传和一个大型上传

时间:2013-11-01 16:53:23

标签: python mongodb pymongo

我正在使用MongoDB来存储数据。我正在将数据整齐排列,但也可以轻松地组合成一个大块并一次性推送。

一次性推送所有数据是否有优势?或者我应该单独推动每个块?

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

1 个答案:

答案 0 :(得分:2)

有三个主要考虑因素:

  1. 以较小的批次通过电线发送文档的开销。例如,您需要发送多少数据才能发送文件。
  2. 由于等待确认插入而发送更多批次会产生多少额外延迟。
  3. 包含更多文档的大型邮件需要更多时间在服务器上执行插入导致期间的事实是服务器似乎“锁定”。
  4. 大小开销:

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

    延迟:

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

    服务器锁定:

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

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

    我建议您查看Python驱动程序的Motor扩展名。它应该允许你:

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

      完全披露:我处理Java Asynchronous Driver,但任何异步驱动程序都应该能够提供上面列表中的好处。