我正在使用MongoDB来存储数据。我正在将数据整齐排列,但也可以轻松地组合成一个大块并一次性推送。
一次性推送所有数据是否有优势?或者我应该单独推动每个块?
另外,对于我可以一次推送多少数据有什么限制吗?一次推送所有内容大约为30MB,而每个大块只有大约10KB。在任何一种情况下,我将存储相同数量的文档(每个文档<1KB)。我正在使用pymongo,以防万一。
答案 0 :(得分:2)
有三个主要考虑因素:
大小开销:
发送的插入消息的修复开销为20字节加上“。”的长度。串。数十MB范围内的单个消息的大小是有限的,因此您可以节省一些数据传输空间,但对于1KB文档,开销比率可以忽略不计。
延迟:
根据客户端与服务器的“网络距离”,这可能会产生更大的影响。非异步驱动程序将发送插入消息,然后等待回复。这包括插入的时间和将消息发送到服务器并接收回复的时间。即使在快速的1/4毫秒往返本地网络上,发送3,000条消息(30MB / 10KB)也会产生750毫秒的等待时间。如果客户端是“远程”并且具有10毫秒的ping时间,那么我们等待30秒。异步驱动程序可以通过发送更多请求来填补等待时间。
服务器锁定:
当您在一个批处理中插入更多文档时,服务器将占用并保持数据库锁定更长的时间。这将在写入完成时停止与数据库的所有其他交互(包括更新索引等。根据您的工作负载,这导致暂停,而服务器执行写入可能会导致其他编写者和读者不必要的问题。
最后,批量插入有一个主要的缺点:如果任何插入失败,你将不知道哪个失败了。服务器可以返回错误,但不会说哪个文档失败。您可以让服务器“继续出错”,但这只会使情况略有好转。
我建议您查看Python驱动程序的Motor扩展名。它应该允许你:
HTH,Rob
完全披露:我处理Java Asynchronous Driver,但任何异步驱动程序都应该能够提供上面列表中的好处。