这是我过去 2 天优化和分析的一段代码,因为它花费了太多时间:
{
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)>
, 20 000 个元素。这个插入总是只需要几毫秒。 tokensArray
是 std::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/