首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++驱动程序的低MongoDB插入性能

C++驱动程序的低MongoDB插入性能
EN

Stack Overflow用户
提问于 2013-02-04 03:27:47
回答 1查看 1.6K关注 0票数 2

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

代码语言:javascript
复制
{
    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)>,有20000个元素。此插入操作始终只需几毫秒。tokensArraystd::vector<BSON (int64_t, std::string)>,5000个元素。这是奇怪的插入物。

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-04 21:28:55

MongoDB在后台执行很多操作,所以插入大的postingsArray需要很少的时间,但会影响之后的性能,这是很正常的。当您单独测量postingsArray插件时,您仅测量了MongoDB驱动程序接受插件所需的时间。但是,当您测量后续操作时,您会开始注意到由postingsArray插入启动的后台工作负载。

请看第六点:http://article.gmane.org/gmane.comp.db.mongodb.user/818

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

备注:您可能希望更改写入关注点,以便测量MongoDB执行insert:http://article.gmane.org/gmane.comp.db.mongodb.user/68288所用的实际时间

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14676339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档