这是我花了两天时间优化和分析的一段代码,因为它花费了太多时间:
{
mongo::ScopedDbConnection _dbConnection (DbHost);
_dbConnection->insert(TokensDB, tokensArray );
_dbConnection.done();
}
{
mongo::ScopedDbConnection _dbConnection (DbHost);
_dbConnection->insert(IdxDB, postingsArray);
_dbConnection.done();
}这里的postingsArray是std::vector<BSON (int64_t, int64_t, int64_t, int)>,有20000个元素。此插入操作始终只需几毫秒。tokensArray是std::vector<BSON (int64_t, std::string)>,5000个元素。这是奇怪的插入物。
如果我完全按照上面的代码片段做,它需要45-50毫秒。但是,如果我像最初一样交换两个块(首先插入IdxDB,然后插入TokensDB ),则需要400-500ms。这里发生什么事情?为什么顺序很重要?为什么插入5000个2字段记录比插入20k 4字段对象花费的时间要长得多?
我最初的想法是因为std::string字段(它只包含一个英文单词,所以平均大约有5-7个符号)。我将其替换为随机int64_t数-插入完成时间没有明显变化。
所有的分析都是在一个干净的数据库上完成的,并且每次都使用完全相同的数据,我不认为这是我在组织测量方面的错误。
发布于 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所用的实际时间
https://stackoverflow.com/questions/14676339
复制相似问题