gpt4 book ai didi

c++ - 使用 C++ 驱动程序时 MongoDB 插入性能低

转载 作者:可可西里 更新时间:2023-11-01 10:33:40 26 4
gpt4 key购买 nike

这是我在过去 2 天里优化和分析的一段代码,因为它花费了太多时间:

{
mongo::ScopedDbConnection _dbConnection (DbHost);
_dbConnection->insert(TokensDB, tokensArray );
_dbConnection.done();
}

{
mongo::ScopedDbConnection _dbConnection (DbHost);
_dbConnection->insert(IdxDB, postingsArray);
_dbConnection.done();
}

在这里postingsArraystd::vector<BSON (int64_t, int64_t, int64_t, int)> , 20 000 个元素。这个插入总是只需要几毫秒。 tokensArraystd::vector<BSON (int64_t, std::string)> , 5000 个元素。这是奇怪的插入。

如果我完全按照上面的代码片段进行操作,则需要 45-50 毫秒。但是,如果我像最初那样切换两个 block (首先插入 IdxDB,然后插入 TokensDB),则需要 400-500 毫秒。这里发生了什么?为什么顺序很重要?为什么插入 5000 条 2 字段记录比插入 20k 4 字段对象花费的时间长得多?

我最初的想法是因为 std::string字段(它包含单个英文单词,因此平均约有 5-7 个符号)。我已将其替换为随机 int64_t number - 插入完成时间没有明显变化。

所有的分析都是在一个干净的数据库上完成的,每次都使用完全相同的数据,我不认为这是我在组织测量方面的错误。

最佳答案

MongoDB 在后台执行很多操作,因此插入大型 postingsArray 花费的时间很少但影响之后的性能是正常的。当您单独测量 postingsArray 插入时,您只是在测量 MongoDB 驱动程序接受插入所花费的时间。但是,当您测量后续操作时,您会开始注意到 postingsArray 插入启动的后台工作负载。
参见第 6 点:http://article.gmane.org/gmane.comp.db.mongodb.user/818

顺便说一句,按照您编写示例的方式,我怀疑 MongoDB 会为您提供相同的插入连接。 (例如,您可能正在从池中获取连接,插入 postingsArray,释放它,然后再次从池中获取相同的连接并插入 tokensArray ).在那种情况下,TCP/IP 套接字可能仍忙于 postingsArray 插入,您所看到的可能会达到 TCP/IP 缓冲区的限制。

附言您可能想要更改写关注以测量 MongoDB 执行插入所需的实际时间:http://article.gmane.org/gmane.comp.db.mongodb.user/68288

关于c++ - 使用 C++ 驱动程序时 MongoDB 插入性能低,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14676339/

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