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 毫秒。但是,如果我像最初那样切换两个块(插入IdxDB第一个和TokensDB第二个),则需要 400-500 毫秒。这里发生了什么?为什么顺序很重要?为什么插入 5000 个 2-field 记录比插入 20k 4-field 对象花费更长的时间?

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

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

4

1 回答 1

2

MongoDB在后台执行了很多事情,所以插入大数据postingsArray的时间很短,但会影响之后的性能,这是正常的。当您postingsArray单独测量插入时,您仅测量 MongoDB 驱动程序接受插入所需的时间。但是,当您测量后续操作时,您开始注意到postingsArray插入启动的后台工作负载。
见第 6 点:http ://article.gmane.org/gmane.comp.db.mongodb.user/818

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

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

于 2013-02-04T13:28:54.587 回答