gpt4 book ai didi

python - MongoDB 许多小上传与一次大上传

转载 作者:可可西里 更新时间:2023-11-01 10:32:37 25 4
gpt4 key购买 nike

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

一次推送所有数据是否有优势?还是应该单独推送每个 block ?

另外,一次推送的数据量有限制吗?一次推送所有内容将是 ~30MB,而每个 block 只有 ~10KB。无论哪种情况,我都将存储相同数量的文档(每个文档 <1KB)。我正在使用 pymongo,以防有所作为。

最佳答案

主要考虑三个方面:

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

大小开销:

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

延迟:

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

服务器锁定:

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

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

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

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

HTH,罗伯

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

关于python - MongoDB 许多小上传与一次大上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19731422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com