gpt4 book ai didi

c# - 如何提高 MongoDB 插入性能

转载 作者:IT老高 更新时间:2023-10-28 13:05:39 34 4
gpt4 key购买 nike

结果:

如果您正在对容错的数据集进行操作,或者执行一次可以验证的过程,则将 WriteAcknowledge 更改为 Unacknowledged 会有所帮助。

另外,批量操作默认是 IsOrdered 的,我没有意识到这一点。将此设置为 False 实际上会使操作批量执行,否则它将作为一个更新线程运行。


MongoDB 3.0/WiredTiger/C# 驱动程序

我有一个包含 147,000,000 个文档的集合,其中我每秒(希望)大约执行一次更新。 3000 份文件。

这是一个更新示例:

"query" : {
"_id" : BinData(0,"UKnZwG54kOpT4q9CVWbf4zvdU223lrE5w/uIzXZcObQiAAAA")
},
"updateobj" : {
"$set" : {
"b" : BinData(0,"D8u1Sk/fDES4IkipZzme7j2qJ4oWjlT3hvLiAilcIhU="),
"s" : true
}
}

这是一个典型的更新,我的要求是以每秒 3000 个的速度插入。

不幸的是,这些花费了两倍的时间,例如,最后一次更新是针对 1723 个文档,并且花费了 1061 毫秒。

集合只有 _id 上的索引,没有其他索引,集合的平均文档大小为 244 字节,无上限。

服务器有 64GB 内存,12 个线程。插入性能在集合规模较小的情况下非常出色,比如大约 5000 万,但在大约 8000 万之后真正开始下降。

可能是因为整个集合没有放在内存中吗?数据库由 RAID0 SSD 支持,因此 IO 性能不应该成为瓶颈,如果是的话,它应该在一开始就表明这一点?

希望得到一些指导,因为我相信 MongoDB 可以满足我与使用它的某些应用程序相比相当微薄的要求。数据库的读取率并不高,因此分片不会改善问题,尽管我可能错了.

不管怎样,目前的插入率都不够好。

更新:这里只是查询的 explain()...

"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "Collection",
"indexFilterSet" : false,
"parsedQuery" : {
"_id" : {
"$eq" : { "$binary" : "SxHHwTMEaOmSc9dD4ng/7ILty0Zu0qX38V81osVqWkAAAAAA", "$type" : "00" }
}
},
"winningPlan" : {
"stage" : "IDHACK"
},
"rejectedPlans" : []
},
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 1,
"executionTimeMillis" : 1,
"totalKeysExamined" : 1,
"totalDocsExamined" : 1,
"executionStages" : {
"stage" : "IDHACK",
"nReturned" : 1,
"executionTimeMillisEstimate" : 0,
"works" : 2,
"advanced" : 1,
"needTime" : 0,
"needFetch" : 0,
"saveState" : 0,
"restoreState" : 0,
"isEOF" : 1,
"invalidates" : 0,
"keysExamined" : 1,
"docsExamined" : 1
},
"allPlansExecution" : []
},

它自己的查询非常快,更新操作大约需要 25 毫秒,它们正在使用 BulkWriter 推送到 Mongo:await m_Collection.BulkWriteAsync(updates);

最佳答案

您可以尝试修改Write concern levels .显然这是有风险的,因为你无法捕捉到任何写入错误,但至少你应该仍然能够捕捉到网络错误。由于 MongoDB 将批量插入操作分组到 groups of 1000 ,这应该加快这个过程。

W默认为1:

enter image description here

当您将其更改为 0 时:

enter image description here

如果您不关心元素的顺序,调用无序批量操作可以获得一些速度

await m_Collection.BulkWriteAsync(updates, new BulkWriteOptions() { IsOrdered = false });

With an unordered operations list, MongoDB can execute in parallel the write operations in the list and in any order. Link

关于c# - 如何提高 MongoDB 插入性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31298291/

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